Google cloud platform 将数据加载到BigQuery表的最佳实践是什么?

Google cloud platform 将数据加载到BigQuery表的最佳实践是什么?,google-cloud-platform,google-bigquery,Google Cloud Platform,Google Bigquery,目前我正在使用WRITE\u APPEND将数据从googlestorage加载到stage\u table\u orders。由于这会同时加载新订单和现有订单,因此可能会出现同一订单有多个版本的情况,字段etl_timestamp会告诉您哪一行是最新的一行 然后我WRITE\u TRUNCATEmyproduction\u table\u orders使用如下查询: select ... from ( SELECT * , ROW_NUMBER() OVER (PARTITI

目前我正在使用
WRITE\u APPEND
将数据从
googlestorage
加载到
stage\u table\u orders
。由于这会同时加载新订单和现有订单,因此可能会出现同一订单有多个版本的情况,字段
etl_timestamp
会告诉您哪一行是最新的一行

然后我
WRITE\u TRUNCATE
my
production\u table\u 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\u table\u orders
始终包含每个订单的最新版本

假设此过程每3分钟运行一次

我想知道这是否是最好的做法。 我有大约2000万行。每3分钟
WRITE\u TRUNCATE
20M行似乎并不明智


建议?

我们也在这样做。不过,为了帮助提高性能,请尝试按购买的日期对表进行分区,并按订单ID对表进行集群。 使用CTAS语句(表本身),因为不能在事实之后添加分区

编辑:使用2个表并合并

根据您的特定用例,即新旧之间可以更新的字段数量,您可以使用两个表,例如,
stage\u table\u orders
用于导入的记录,
final\u table\u orders
作为目标表和do 像这样的
合并

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子句中明确列出字段。如果模式非常固定,那么这是一次性的工作


有很多方法可以消除重复,并且没有一刀切的方法。使用
ARRAY\u AGG
EXISTS
DELETE
UNION ALL
,在SO中搜索类似请求,。。。尝试一下,看看哪个数据集的性能更好。

是否每5分钟进行一次?这不会导致谷歌的巨额账单吗?不会比你目前的解决方案多,而且可能会因为删减而少。你试过了吗?我添加了一个替代方案。