簡體   English   中英

將數據加載到BigQuery表中的最佳做法是什么?

[英]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中搜索類似的請求,或者使用DELETEUNION ALL EXISTS搜索...,嘗試一下,看看哪種方法對您的數據集效果更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM