从 BigQuery 中的最新表分区通配符查询

Posted

技术标签:

【中文标题】从 BigQuery 中的最新表分区通配符查询【英文标题】:Query from Latest Table Partition Wildcard in BigQuery 【发布时间】:2017-11-06 07:14:50 【问题描述】:

我有名为 sample 和 table_201606、table_201607 的数据集,直到 table_201710。然后我要完成的事情是从最新的 TABLE SUFFIX 中获取数据,即 table_201710。以下是我的查询:

     WITH max_table_time AS(
        SELECT
            TIMESTAMP_ADD(MAX(time), INTERVAL 1 HOUR) AS max_time,
            FORMAT_DATE("%Y%m", DATE(MAX(time))) AS par
        FROM
            `sample.table_*`
    ),


    xyz as(
        SELECT id, sum(total_a) as total_b, sum(total_c) as sum_total
        FROM `sample.table_*`
        WHERE _TABLE_SUFFIX = (SELECT par from play_partitions) 
        GROUP BY video_id
    )

    SELECT * FROM xyz

不知何故,上面的查询扫描了所有表(从 table_201606 到 table_201710),但结果很好(table_201710 中的数据)。

但是,当我尝试这个时,结果会有所不同:

WITH max_table_time AS(
        SELECT
            TIMESTAMP_ADD(MAX(time), INTERVAL 1 HOUR) AS max_time,
            FORMAT_DATE("%Y%m", DATE(MAX(time))) AS par
        FROM
            `sample.table_*`
    ),


    xyz as(
        SELECT id, sum(total_a) as total_b, sum(total_c) as sum_total
        FROM `sample.table_*`
        WHERE _TABLE_SUFFIX = '201710' 
        GROUP BY video_id
    )

    SELECT * FROM xyz

上面的查询,只是扫描了table_201710和table_201710中的结果数据。与第一个查询不同,它扫描所有表,但结果是 table_201710 中的正确数据。

我怎么能说第一个查询扫描了所有表?因为当我执行第一个查询时,BigQuery 控制台只是说我使用 10 GB 数据,而不是第二个查询,它只使用在进程中处理的 200 MB 数据。

我想知道为什么,有人可以解释一下吗?

【问题讨论】:

【参考方案1】:

刚刚仔细阅读了BigQuery中的通配符表,发现了这些句子

使用 _TABLE_SUFFIX 可以大大减少扫描的字节数,从而降低运行查询的成本。 _TABLE_SUFFIX 上包含子查询的过滤器不能用于限制扫描通配符表的表数。例如,以下查询不限制为通配符表 bigquery-public-data.noaa_gsod.gsod19* 扫描的表

在进行这些查询之前,我没有进行 RTFM。 :D

【讨论】:

以上是关于从 BigQuery 中的最新表分区通配符查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Big Query 的标准 SQL 中使用通配符为特定分区查询多个表

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

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

从 SQL 查询向 BigQuery 表添加多个分区列

使 BigQuery 表数据保持最新

Bigquery - 选择数据集中的所有表和分区