作为我们的Bigquery解决方案的一部分,我们有一个cron作业,它检查在数据集中创建的最新表,如果此表已过期,将创建更多。此检查通过以下查询完成
SELECT table_id FROM [dataset.__TABLES_SUMMARY__] WHERE table_id LIKE 'table_root%' ORDER BY creation_time DESC LIMIT 1
我们的集成测试最近一直在抛出错误,因为这个查询正在攻击Bigquery的内部缓存,即使针对基础表运行查询会提供不同的结果。如果我在Google云端控制台的Web界面中运行此查询,也会发生此缓存。
如果我指定查询不使用
进行缓存queryRequest.setUseQueryCache(false)
在代码中标记然后测试正确传递。
我的理解是,如果针对基础表运行查询会提供不同的结果,则不会发生Bigquery自动缓存。我在这个假设中是不正确的,在哪种情况下它会发生或者这是一个错误?
答案 0 :(得分:1)
你问题的答案是:你在概念上做错了。如果不需要缓存数据,则始终需要设置无缓存参数。即使在Web UI上也有您需要使用的选项。默认设置是使用缓存版本。
但是,从根本上说,您需要更改流程并使用最近的功能:
使用模板表自动创建表
将数据流式传输到BigQuery的常见使用模式是将逻辑表拆分为许多较小的表,用于创建较小的数据集(例如,按日期或按用户ID)或用于可伸缩性(例如,流式传输比当前限制为每秒100,000行)。要将表拆分为许多较小的表而不添加复杂的客户端代码,请使用BigQuery模板表功能让BigQuery为您创建表。
要通过BigQuery API使用模板表,请将insertSuffix参数添加到insertAll请求
通过使用模板表,可以避免单独创建每个表并为每个表指定模式的开销。您只需要创建一个模板,并提供不同的后缀,以便BigQuery可以为您创建新表。 BigQuery将表放在同一个项目和数据集中。模板还可以更轻松地更新架构,因为您只需要更新模板表。
通过模板表创建的表通常可在几秒钟内完成。
这样您就不需要拥有cron,因为它会自动创建缺少的表。
在此处阅读更多内容:https://cloud.google.com/bigquery/streaming-data-into-bigquery#template-tables