[英]What is the best practice for loading data into BigQuery table?
目前,我正在使用WRITE_APPEND
將數據從Google Storage
stage_table_orders
加載到stage_table_orders
中。 由於此訂單同時加載新訂單和現有訂單,因此可能會出現同一訂單具有多個版本的情況,字段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分鍾運行一次 。
我想知道這是否是最佳做法。 我大約有2000萬行。 每3分鍾WRITE_TRUNCATE
20M行似乎WRITE_TRUNCATE
。
建議?
我們也一樣。 但是,為了幫助提高性能,請嘗試按date_purchased
對表進行分區, date_purchased
orderid
集群進行分區。 使用CTAS語句(對表本身),因為事后您無法添加分區。
編輯:使用2表和合並
根據您的特定用例,即可以在新舊之間更新的字段數,您可以使用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 :如果“插入”了幾行,效率很高,但不是數百萬(盡管未經測試)+修剪分區應該可以工作。
缺點 :您必須在update和insert子句中顯式列出字段。 如果架構幾乎是固定的,則需要進行一次努力。
有可能要進行重復數據刪除的方法,並且沒有一刀切的功能。 使用ARRAY_AGG
在SO中搜索類似的請求,或者使用DELETE
或UNION ALL
EXISTS
搜索...,嘗試一下,看看哪種方法對您的數據集效果更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.