Google bigquery “良好做法”;更新;?

Google bigquery “良好做法”;更新;?,google-bigquery,Google Bigquery,我有一个包含以下数据的CSV: ID, Name, Address, Date 1 , Paul, Fake 123,2017-01-01 我将该文件上载到一个新表(即:“用户”) 几个月后,我收到了一个CSV,其中包含该表的插入和更新。i、 e ID, Name, Address, Date 1 , Paul, Fake 999,2017-06-01 2 , Joe , Foo 123 ,2017-06-01 ... 如果它是一个普通的SQL数据库,我会进行一次升级(比如Mys

我有一个包含以下数据的CSV:

 ID, Name, Address, Date
 1 , Paul, Fake 123,2017-01-01
我将该文件上载到一个新表(即:“用户”)

几个月后,我收到了一个CSV,其中包含该表的插入和更新。i、 e

 ID, Name, Address, Date
 1 , Paul, Fake 999,2017-06-01
 2 , Joe , Foo 123 ,2017-06-01
 ...
如果它是一个普通的SQL数据库,我会进行一次升级(比如Mysql中的Replace)。但是在BigQuery中实现这一点的最佳模式是什么?每个表的DML更新配额限制为96,太小了:(

我在“事务”表和“最终”表中思考

当我有一个新文件时,我可以上传到事务表中。之后,我可以执行一个查询,获取每个“ID”的最后一个值,并将该数据放入“Final”表中。显然,该查询具有“writeDisposition:WRITE_TRUNCATE”选项来擦除旧数据

我认为这是一个混乱的解决方案,但我找不到更好的方法。有人知道如何做得更好吗?有没有地方可以阅读BigQuery的“设计模式”?

一些注释

  • 我假设数据的更改相对于目标数据而言足够大,足以覆盖目标表。例如,如果目标表有数百条更改记录,而目标表有10亿条记录,则不希望采用这种方法
  • 此外,查询可能需要对分区表进行一些更改
  • 作为一个副作用,这将从目标表中删除任何重复的记录。因此,您需要仔细选择用于标识记录更改的列
使用联接和定位表:

让我们调用需要合并到目标表的带有更改数据源的表

SELECT SRC.Id as Id,
       SRC.Name as Name,
       SRC.Address as Address,
       SRC.Date as Date
FROM SourceTable SRC 
     LEFT OUTER JOIN TargetTable TGT
USING (Id)
WHERE TGT.Id IS NULL

UNION DISTINCT

SELECT CASE WHEN (SRC.Id IS NOT NULL AND SRC.Name IS NOT NULL AND SRC.Address IS NOT NULL AND SRC.Date IS NOT NULL) THEN SRC.Id ELSE TGT.Id END AS Id,
       CASE WHEN (SRC.Id IS NOT NULL AND SRC.Name IS NOT NULL AND SRC.Address IS NOT NULL AND SRC.Date IS NOT NULL) THEN SRC.Name ELSE TGT.Name END AS Name,
       CASE WHEN (SRC.Id IS NOT NULL AND SRC.Name IS NOT NULL AND SRC.Address IS NOT NULL AND SRC.Date IS NOT NULL) THEN SRC.Address ELSE TGT.Address END AS Address,
       CASE WHEN (SRC.Id IS NOT NULL AND SRC.Name IS NOT NULL AND SRC.Address IS NOT NULL AND SRC.Date IS NOT NULL) THEN SRC.Date ELSE TGT.Date END AS Date
FROM SourceTable SRC 
     RIGHT OUTER JOIN TargetTable TGT
USING (Id) 
现在,您可以在目标表上使用WRITE_TRUNCATE运行上述查询。 我没有测试过这个特定的查询,但这种方法很好。在Bigquery中,通过少量编码或自定义项可以降低查询的复杂性。性能在很大程度上取决于更改数据的大小和性质


我希望这会有所帮助。

我希望其他人能写出完整的答案,但一个常见的解决方案是每天都有一个仅附加的表和一个逻辑视图。对于当前一天,逻辑视图选择每个维度中最新的值。在一天结束时,运行更新查询以修复重复项,然后更改逻辑视图视图仅为当天的
选择*
。确保对视图定义使用标准SQL。