BigQuery:查询最新分区、要处理的字节数与实际处理的字节数

Posted

技术标签:

【中文标题】BigQuery:查询最新分区、要处理的字节数与实际处理的字节数【英文标题】:BigQuery: querying the latest partition, bytes to be processed vs. actually processed 【发布时间】:2020-07-15 21:18:26 【问题描述】:

我正在努力使用日期或日期时间字段有效地查询表的最后一个分区。第一种方法是像这样过滤:

SELECT *
FROM my_table
WHERE observation_date = (SELECT MAX(observation_date) FROM my_table)

但是,根据 BigQuery 的处理估计,它会扫描整个表并且不使用分区。甚至谷歌也在他们的文档中声明这发生了。如果我对分区使用确切的值,它确实有效:

SELECT *
FROM my_table
WHERE observation_date = CURRENT_DATE

但是如果表不是最新的,那么查询将不会得到任何结果,并且我的自动处理将失败。如果我包含像observation_date = DATE_SUB(CURRENT_DATE, INTERVAL 2 DAY) 这样的偏移量,我可能会错过最新的分区。

高效获取最新分区的最佳做法是什么?

更糟糕的是,BigQuery 对活动查询要处理的字节数的估计与实际处理的字节数不匹配,除非我没有正确解释这些数字。在下面找到不匹配值的屏幕截图。

BigQuery screen with aparrently mistmatching processed bytes

最后我还测试了几个场景:

如果我按照in this post 的建议首先存储带有 DECLARE 语句的 max_date,估计似乎有效,但不清楚原因。但是,运行查询后实际处理的字节数与在 WHERE 子句中过滤最新分区的情况没有什么不同。 在分区和集群的表中使用相同声明的 max_date,估计仅在对分区使用过滤器时有效,但如果我为集群包含过滤器,则会失败。

【问题讨论】:

如何从屏幕截图中判断字节不匹配? 您是否阅读过 Bigquery 中的分区 pruning 机制? 屏幕截图显示两个不匹配的值以黄色突出显示。我期望这些值是相同的,也许我错了。绿色线是 BigQuery 对您在编辑器中输入内容的估计,灰色线是执行后实际处理的字节数。 我读过关于剪枝的文章,但这只是建议我不应该使用子查询来过滤分区字段。此外,我正在使用日期或日期时间字段,并且没有为这种类型的分区创建伪列。 由于查询最新分区可能是最常见的任务,我认为值得贡献并表明您有兴趣将此功能扩展到 Bigquery 开发人员。你是否已经访问过这个公共追踪器的thread? 【参考方案1】:

经过一些迭代后,我得到了 Google 的答复,虽然它没有解决问题,但它承认它确实发生了。

使用 DATE 或 DATETIME 字段分区的表无法有效地查询其最新分区。最佳做法仍然是使用 WHERE observation_date = (SELECT MAX(observation_date) FROM my_table) 之类的内容进行过滤,这将扫描整个表。

他们做了笔记以尝试在未来改进这一点,但我们现在必须处理这个问题。我希望这对尝试做同样事情的人有所帮助。

【讨论】:

以上是关于BigQuery:查询最新分区、要处理的字节数与实际处理的字节数的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 中的分区表

BigQuery 整数分区 - 我可以使用另一个查询的结果来获取要访问的分区列表吗?

在 Bigquery 中的分区表上插入查询

BigQuery 中的分区如何工作?

如何从手动分区的 BigQuery 表中引用最新表

BigQuery:在自定义分区字段上运行 Select 时处理的数据