命中 table 时的 Bigquery 缓存会提供不同的结果吗?

Bigquery caching when hitting table would provide a different result?

作为我们 Bigquery 解决方案的一部分,我们有一个 cron 作业,它检查在数据集中创建的最新 table,如果这个 table 超出 date.This 检查是完成以下查询

SELECT table_id FROM [dataset.__TABLES_SUMMARY__] WHERE table_id LIKE 'table_root%' ORDER BY creation_time DESC LIMIT 1

我们的集成测试最近一直在抛出错误,因为此查询正在命中 Bigquery 的内部缓存,即使 运行 对基础 table 查询会提供不同的结果。如果我在来自 Google 云控制台的 Web 界面中 运行 此查询,也会发生此缓存。

如果我指定查询不缓存使用

queryRequest.setUseQueryCache(false)

在代码中标记然后测试正确通过。

我的理解是,如果 运行 对底层 table 的查询会提供不同的结果,则不会发生 Bigquery 自动缓存。我在这个假设中是否不正确,在什么情况下它会在什么时候发生或者这是一个错误?

那么你的问题的答案是:你在概念上做错了。如果您不需要缓存数据,则始终需要设置无缓存参数。即使在网络 UI 上,也有您需要使用的选项。默认是使用缓存版本。

但是,从根本上说,您需要更改流程并使用最新功能:
使用模板table自动table创建tables

将数据流式传输到 BigQuery 的一种常见使用模式是将逻辑 table 拆分为许多较小的 table,以创建较小的数据集(例如,按日期或按用户 ID ) 或可扩展性(例如,流式传输超过每秒 100,000 行的当前限制)。要在不添加复杂的 client-side 代码的情况下将 table 拆分为许多较小的 table,请使用 BigQuery 模板 tables 功能让 BigQuery 创建 table你.

要通过 BigQuery API 使用模板 table,请将 templateSuffix 参数添加到您的 insertAll 请求

通过使用模板 table,您可以避免单独创建每个 table 并为每个 table 指定架构的开销。您只需创建一个模板,并提供不同的后缀,以便 BigQuery 可以为您创建新的 table。 BigQuery 将 table 放在同一个项目和数据集中。模板还可以更轻松地更新架构,因为您只需要更新模板 table.

通过模板 table 创建的表格通常在几秒钟内可用。

这样您就不需要 cron,因为它会自动创建缺少的 tables。

在此处阅读更多内容:https://cloud.google.com/bigquery/streaming-data-into-bigquery#template-tables