BigQuery 在时间分区表上的缓存如何工作?

Posted

技术标签:

【中文标题】BigQuery 在时间分区表上的缓存如何工作?【英文标题】:How does BigQuery caching on time partitioned tables work? 【发布时间】:2017-11-13 13:52:49 【问题描述】:

与 BigQuery 文档相比,我们看到它确实在从流式数据分区表(标准 SQL)中选择数据时缓存结果。

示例: 当我们使用以下方法对流式数据分区表执行确定性日期扫描时:

where (_PARTITIONTIME > '2017-11-12' or _PARTITIONTIME is null)

...如果我们在该时间范围内触发相同的确切查询,BigQuery 会将数据缓存 5 到 20 分钟。

在我对documentation 的解释中,它声明它不应该缓存数据:

'当查询引用的任何表最近收到流式插入(流式缓冲区附加到表)时,即使没有新行到达'

重要提示:

我们的测试查询查询真正连续不断到达我们的心跳事件 我们实际上想要这种缓存行为,因为我们并不总是需要让数据到最后一秒都是真实的。我们只是想知道我们是否真的可以依赖这种行为。

我们的问题:

这里发生了什么/为什么会发生 BQ 缓存?

此数据在 BQ 缓存中停留的时间是“随机的”(5-20​​ 分钟之间)。这是什么意思?

【问题讨论】:

由于您在问题中交替使用流表和分区表,我不确定您指的是哪一个。或者,您正在流式传输到分区表并认为缓存不应该工作,但它正在工作? 我更正了它。它也是一个日期分区的流表。是的,根据文档缓存不应该工作。但显然确实如此。虽然不是 24 小时,但在 5-20 分钟之间...... 【参考方案1】:

感谢您澄清问题。我认为我们没有为带有流数据的分区表禁用缓存是一个忽视。否则查询可能会返回过时的结果。

当表改变时,我们使缓存失效。流式传输到表中将导致表被更改。我猜这就是缓存在 5 到 20 分钟之间失效的原因。

【讨论】:

但这仍然是一种奇怪的行为,因为这是一个每隔一秒就有新数据应该到达的表。 AFAIK google 确实在 Bigquery 中进行了一些微批处理,以将流缓冲区中的数据添加到持久表中。但是这个查询甚至从流缓冲区中选择数据(_PARTITIONTIME 为空)并且仍然设法进行缓存...... 是的,这是奇怪/错误的行为。我在内部提交了一个错误。对于分区表,我们不考虑流式缓冲区进行缓存,但我们应该这样做。当流缓冲区中批处理的数据写入表时,表会发生更改,这会使缓存无效。感谢您报告此问题。

以上是关于BigQuery 在时间分区表上的缓存如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 分区表上的 DML 支持

BigQuery 中的分区如何工作?

BigQuery 表如何与分区和集群字段一起使用?

使用特定时间戳列将 CSV 导入 BigQuery 上的分区表?

尚不支持 BigQuery、非分区表上的通配符表和基于字段的分区表

列中的 BigQuery 日期分区