从BigQuery

时间:2017-11-06 07:14:51

标签: google-bigquery wildcard standard-sql

我有一个名为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 个答案:

答案 0 :(得分:0)

仔细阅读BigQuery中的通配符表,找到这些句子:

  

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

我在做这些查询之前没有做RTFM。 :D