首页 > 解决方案 > 使 BigQuery 表数据保持最新

问题描述

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

标签: google-bigquery

解决方案


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

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

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

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

CREATE TABLE ActivePartition (active DATE);

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

DECLARE active DATE DEFAULT (SELECT active FROM ActivePartition);

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

推荐阅读