击中表时的Bigquery缓存会提供不同的结果吗?

时间:2016-01-19 10:46:05

标签: google-bigquery

作为我们的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自动缓存。我在这个假设中是不正确的,在哪种情况下它会发生或者这是一个错误?

1 个答案:

答案 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