Как запретить загрузку дублирующихся строк в BigQuery? - PullRequest
0 голосов
/ 20 апреля 2020

Мне было интересно, есть ли способ запретить дубликаты из BigQuery?

На основании этой статьи Я могу дедуплицировать целое или раздел таблицы.

Чтобы дедуплицировать всю таблицу:

CREATE OR REPLACE TABLE `transactions.testdata`
PARTITION BY date
AS SELECT DISTINCT * FROM `transactions.testdata`;

Чтобы дедуплицировать таблицу на основе разделов, определенных в предложении WHERE:

MERGE `transactions.testdata` t
USING (
  SELECT DISTINCT *
  FROM `transactions.testdata`
  WHERE date=CURRENT_DATE()
)
ON FALSE
WHEN NOT MATCHED BY SOURCE AND date=CURRENT_DATE() THEN DELETE
WHEN NOT MATCHED BY TARGET THEN INSERT ROW

Если нет способа чтобы запретить дубликаты, является ли это разумным подходом для дедупликации таблицы?

1 Ответ

1 голос
/ 20 апреля 2020

BigQuery не имеет такого механизма, как ограничения , который можно найти в традиционных СУБД. Другими словами, вы не можете установить первичный ключ или что-то в этом роде, потому что BigQuery ориентирован не на транзакции, а на быстрый анализ и масштабируемость. Вы должны думать о нем как о озере данных, а не как о базе данных со свойством уникальности.

Если у вас есть существующая таблица и вам необходимо ее дублировать, упомянутые подходы будут работать. Если вам нужно, чтобы в вашей таблице были уникальные строки по умолчанию, и вы хотите программно вставлять уникальные строки в вашу таблицу, не прибегая к внешним ресурсам, я могу предложить вам обходной путь:

  1. Сначала вставьте данные во временную table
  2. Затем выполните запрос во временной таблице и сохраните результаты в вашей фактической таблице. Этот шаг может быть программно выполнен несколькими различными способами:

    • Используя подход, который вы упомянули как запланированный запрос
    • Используя bq такая команда, как bq query --use_legacy_sql=false --destination_table=<dataset.actual_table> 'select distinct * from <dataset.temporary_table>', которая будет запрашивать различные значения во временной таблице и загружать результаты в целевую таблицу, указанную в атрибуте --destination_table. Важно отметить, что этот подход будет работать и для секционированных таблиц.
  3. Наконец, удалите временную таблицу. Как и предыдущий шаг, этот шаг можно выполнить с помощью запланированного запроса или команды bq.

Надеюсь, это поможет

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