Как вставить столбцы с синтаксисом вложенных имен (например, "item.description")? - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь объединить две базы данных с одной и той же схемой в Google BigQuery.

Я использую следующие примеры объединения: https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#merge_statement

Однако в моих таблицах есть вложенные столбцы., т.е. "service.id" или "service.description"

Мой код до сих пор:

MERGE combined_table
USING table1
ON table1.id = combined_table.id
WHEN NOT MATCHED THEN
  INSERT(id, service.id, service.description)
  VALUES(id, service.id, service.description)

Однако я получаю сообщение об ошибке: Syntax error: Expected ")" or "," but got "." и красный волнистыйПодчеркните .id в строке INSERT(...).

Вот часть схемы моей таблицы:

[
    {
        "name": "id",
        "type": "STRING"
    },
    {
        "name": "service",
        "type": "RECORD",
        "fields": [
            {
                "name": "id",
                "type": "STRING"
            },
            {
                "name": "description",
                "type": "STRING"
            }
        ]
    },
    {
        "name": "cost",
        "type": "FLOAT"
    }
...
]

Как правильно структурировать этот INSERT (...)оператор, чтобы я мог включить вложенные столбцы?

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Синтаксическая ошибка: ожидается ")" или "," но получено "."

Похоже, что вы в правильном направлении. Обратите внимание в документации, как вам нужно вставить значениедля столбца REPEATED,

Вам необходимо определить структуру, которая будет указывать BigQuery, чего ожидать, например:

STRUCT<created DATE, comment STRING>

Это полный пример из документации

MERGE dataset.DetailedInventory T
USING dataset.Inventory S
ON T.product = S.product
WHEN NOT MATCHED AND quantity < 20 THEN
  INSERT(product, quantity, supply_constrained, comments)
   -- insert values like this
   VALUES(product, quantity, true, ARRAY<STRUCT<created DATE, comment STRING>>[(DATE('2016-01-01'), 'comment1')])

WHEN NOT MATCHED THEN
  INSERT(product, quantity, supply_constrained)
  VALUES(product, quantity, false)
1 голос
/ 09 мая 2019

Я нашел ответ.

Оказывается, при ссылке на верхний уровень STRUCT BigQuery ссылается также на все вложенные столбцы. Поэтому, если я хочу вставить service и все его подколонки (service.id и service.description), мне нужно только включить service в оператор INSERT(...).

Сработал следующий код:

...
WHEN NOT MATCHED THEN
  INSERT(id, service)
  VALUES(id, service)

Это объединит все вложенные столбцы, включая service.id и service.description.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...