Как лучше всего загружать данные в таблицу BigQuery? - PullRequest
0 голосов
/ 11 октября 2018

В настоящее время я загружаю данные из Google Storage в stage_table_orders, используя WRITE_APPEND.Поскольку эта загрузка загружает как новый, так и существующий порядок, может быть случай, когда один и тот же порядок имеет более одной версии, поле etl_timestamp указывает, какая строка является наиболее обновленной.

тогда я WRITE_TRUNCATE мой production_table_orders с запросом вроде:

select ...
from (
    SELECT  * , ROW_NUMBER() OVER
    (PARTITION BY date_purchased, orderid order by etl_timestamp DESC) as rn 
    FROM `warehouse.stage_table_orders` )
where rn=1

Тогда production_table_orders всегда содержит самую последнюю версию каждого заказа.

ЭтоПредполагается, что процесс запускается каждые 3 минуты .

Мне интересно, является ли это наилучшей практикой.У меня около 20 миллионов строк.Кажется, не умно WRITE_TRUNCATE 20M строк каждые 3 минуты.

Предложение?

1 Ответ

0 голосов
/ 11 октября 2018

Мы делаем то же самое.Чтобы повысить производительность, попробуйте разделить таблицу на date_purchased и кластеризовать на orderid.Используйте оператор CTAS (к самой таблице), так как вы не можете добавить раздел после факта.

РЕДАКТИРОВАТЬ: используйте 2 таблицы и MERGE

В зависимости от вашего конкретного случая использования, т.е.количество полей, которые могут быть обновлены между старым и новым, вы можете использовать 2 таблицы, например, stage_table_orders для импортированных записей и final_table_orders в качестве таблицы назначения и сделать MERGE примерно так:

MERGE final_table_orders F
USING stage_table_orders S
ON F.orderid = S.orderid AND
   F.date_purchased = S.date_purchased
WHEN MATCHED THEN
  UPDATE SET field_that_change = S.field_that_change
WHEN NOT MATCHED THEN
  INSERT (field1, field2, ...) VALUES(S.field1, S.field2, ...)    

Pro : эффективен, если несколько строк «вставлены», а не миллионы (хотя и не проверены) + обрезка разделов должна работать.

Con : вы должны явно перечислить поля в предложениях update и insert.Единовременное усилие, если схема в значительной степени исправлена.

Возможны способы дедупликации, и не существует единого размера, подходящего всем.Поищите в SO похожие запросы, используя ARRAY_AGG или EXISTS с DELETE или UNION ALL, ... Попробуйте их и посмотрите, какие из них лучше подходят для ВАШЕГО набора данных.

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