Bigquery 将子查询应用于分区时间

Posted

技术标签:

【中文标题】Bigquery 将子查询应用于分区时间【英文标题】:Bigquery apply subquery to partition time 【发布时间】:2020-11-27 12:09:36 【问题描述】:

我有两个单独运行正确的查询,但一起出现错误:

WITH minimum_time AS 
(
    SELECT DATE (min(_PARTITIONTIME)) AS minimums
    FROM `Day`
    WHERE DATE (_PARTITIONTIME) = "2020-11-20"
)
SELECT *
FROM `Day`
WHERE DATE (_PARTITIONTIME) > (SELECT minimums
                               FROM minimum_time)

我得到这个错误:

如果没有筛选列“_PARTITION_LOAD_TIME”、“_PARTITIONDATE”、“_PARTITIONTIME”(可用于分区消除),则无法查询表“Day”

我不太明白为什么会这样,第一个查询返回一个日期。

【问题讨论】:

【参考方案1】:

您收到错误是因为:

    该表设置了选项:require_partition_filter=true,如果未指定分区过滤器,则对该表的查询将失败。 使用子查询作为分区过滤器存在限制,该限制记录在here。

一般来说,如果可以在查询开始时评估过滤器而不需要任何子查询评估或数据扫描,分区修剪将降低查询成本。

解决方法是使用 BigQuery 脚本来预先确定分区过滤器,例如:

DECLARE minimums DATE DEFAULT ((SELECT minimums FROM `Day` WHERE ...));
SELECT *
FROM `Day`
WHERE DATE (_PARTITIONTIME) > minimums; -- minimums is a constant to the second query

【讨论】:

太棒了!非常感谢。

以上是关于Bigquery 将子查询应用于分区时间的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 中的分区如何工作?

bigquery - 自定义字段上的分区 - 仅适用于标准 SQL?

将子查询转换为 JSON 性能

使用 join 语句连接子查询

将子查询转换为单个查询 Hive

将子查询(不在)重写为加入