BigQuery: атомарно заменить раздел даты, используя DML - PullRequest
0 голосов
/ 07 ноября 2018

Я часто хочу загружать данные за один день в таблицу BigQuery с разделением по дате, заменяя любые данные, которые уже есть. Я знаю, как это сделать для таблиц с разделением данных «старого стиля» (тех, которые имеют поле _PARTITIONTIME), но не знаю, как это сделать с таблицами с разделением по дате нового стиля (в которых используется обычная дата Столбец / timestamp для указания разбиения, поскольку они не позволяют использовать декоратор $.

Допустим, я хочу сделать это на my_table. Для таблиц с разделением по дате в старом стиле я выполнил это с помощью задания загрузки, в котором использовался декоратор $ и расположение записи WRITE_TRUNCATE - например, для таблицы назначения было бы установлено значение my_table$20181005.

.

Однако я не уверен, как выполнить эквивалентную операцию с использованием DML. Я выполняю отдельные команды DELETE и INSERT. Это не очень хорошо, потому что увеличивает сложность, количество запросов и не атомарную операцию.

Я хочу знать, как это сделать, используя команду MERGE, чтобы все это содержалось в одной атомарной операции. Однако я не могу обернуть голову вокруг синтаксиса команды MERGE и не нашел пример для этого варианта использования. Кто-нибудь знает, как это сделать?

Идеальным ответом будет выражение DML, которое выделит все столбцы из source_table и вставит его в 2018-10-05 раздел даты my_table, удалив все существующие данные, которые были в my_table 2018-10-05 дата раздела. Можно предположить, что source_table и my_table имеют одинаковые схемы и что my_table разбит на столбец day, который имеет тип DATE.

1 Ответ

0 голосов
/ 07 ноября 2018

потому что они не позволяют использовать $ decorator

Но они это делают - вы можете использовать table_name$YYYYMMDD при загрузке в многораздельную таблицу на основе столбцов. Например, я создал многораздельную таблицу:

$ bq query --use_legacy_sql=false "CREATE TABLE tmp_elliottb.PartitionedTable (x INT64, y NUMERIC, date DATE) PARTITION BY date"

Затем я загрузил в определенный раздел:

$ echo "1,3.14,2018-11-07" > row.csv
$ bq "tmp_elliottb.PartitionedTable\$20181107" ./row.csv

Я попытался загрузить неверный раздел для входных данных и получил ошибку:

$ echo "1,3.14,2018-11-07" > row.csv
$ bq "tmp_elliottb.PartitionedTable\$20181105" ./row.csv
Some rows belong to different partitions rather than destination partition 20181105

Затем я заменил данные для раздела:

$ echo "2,0.11,2018-11-07" > row.csv
$ bq "tmp_elliottb.PartitionedTable\$20181107" ./row.csv

Да, вы можете использовать MERGE как способ замены данных для раздела многораздельной таблицы, но вы также можете использовать задание загрузки.

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