从 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 中使用通配符为特定分区查询多个表