使 BigQuery 表数据保持最新

Posted

技术标签:

【中文标题】使 BigQuery 表数据保持最新【英文标题】:Keeping BigQuery table data up-to-date 【发布时间】:2020-05-08 13:29:13 【问题描述】:

这可能是 BigQuery 的不正确用例,但我有以下问题:我需要定期更新 Big Query 表。从某种意义上说,更新应该是“原子的”,即读取数据的客户端要么只使用旧版本的数据,要么使用全新的数据版本。我现在唯一的解决方案是使用日期分区。这个解决方案的问题是只需要读取最新数据的客户端应该知道分区并且只从某些分区获取数据。每次我想进行查询时,我都必须首先弄清楚要使用哪个分区,然后才能从表中进行选择。有什么办法可以改善这一点吗?理想情况下,我希望解决方案对读取数据的客户来说简单而透明。

【问题讨论】:

可能正在尝试物化视图? 【参考方案1】:

您没有提及更新的大小,我只能提供一些一般性指导。

    大多数 BigQuery 更新,包括单个 DML (INSERT/UPDATE/DELETE/MERGE) 和单个加载作业,都是原子的。您的阅读器读取旧数据或新数据。 目前缺少多语句事务,如果您确实有不适合单个加载作业的更新,解决方案是:
      在所有加载完成后将更新加载到临时表中 使用单个 INSERT 或 MERGE 将临时表中的更新合并到主数据表中 缺点:扫描暂存表不是免费的

更新:因为您有多个表要自动更新,所以有一个小技巧可能会有所帮助。

假设您需要更新的每个表都有一个ActivePartition 列作为分区键,那么您可能有一个只有一行的表。

CREATE TABLE ActivePartition (active DATE);

每次加载后,您将 ActivePartition.active 设置为新的活动日期,然后您的用户使用脚本:

DECLARE active DATE DEFAULT (SELECT active FROM ActivePartition);

-- Actual query
SELECT ... FROM dataTable WHERE ActivePartition = active

【讨论】:

更新基本上是替换整个数据。带有临时表的想法很好,但不幸的是我有多个连接的表需要一起更新。现在我决定坚持使用分区表,但最多将分区数保持为两个。暂存分区和生产分区的种类。 用一点提示更新了答案。

以上是关于使 BigQuery 表数据保持最新的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 数据传输成功,但目标表保持为空

查询 BigQuery 数据集中的最新表

如何从手动分区的 BigQuery 表中引用最新表

从我们仓库中其他 Snowflake DB 派生的数据中使自定义表保持最新的最佳实践

从 BigQuery 中的最新表分区通配符查询

bigquery 是不是保持并发性?