google-bigquery - 使 BigQuery 表数据保持最新
问题描述
这可能是 BigQuery 的不正确用例,但我有以下问题:我需要定期更新 Big Query 表。从某种意义上说,更新应该是“原子的”,即读取数据的客户端要么只使用旧版本的数据,要么使用全新的数据版本。我现在唯一的解决方案是使用日期分区。这个解决方案的问题是只需要读取最新数据的客户端应该知道分区并且只从某些分区获取数据。每次我想进行查询时,我都必须首先弄清楚要使用哪个分区,然后才能从表中进行选择。有什么办法可以改善这一点吗?理想情况下,我希望解决方案对于读取数据的客户来说简单而透明。
解决方案
您没有提及更新的大小,我只能提供一些一般性指导。
- 大多数 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
推荐阅读
- javascript - 如何获取 Javascript 数组中嵌套对象的长度?
- css - nth-child(2) 不选择元素
- c++ - 错误:没有匹配函数调用 'std::__cxx11::basic_string
::basic_string(int&)' - node.js - 提交的 Sequelize 事务的结果是“未定义”
- python - vaex:将列移动 n 步
- asp.net - asp.net mvc核心在ajax的成功函数中添加锚标记
- pdf - UiPath pdf 表格抓取成 DataTable 类型
- reactjs - 根据访问器值有条件地渲染单元格数据
- python - 我的 Heroku python 应用程序需要安装 java
- sql - 是否有任何函数或方法可以按照参照完整性 (FK) 依赖项的顺序从 Snowflake 中检索表名?