如何在 Big Query 的标准 SQL 中使用通配符为特定分区查询多个表
Posted
技术标签:
【中文标题】如何在 Big Query 的标准 SQL 中使用通配符为特定分区查询多个表【英文标题】:How to query multiple tables using wildcard for a particular partition in standard SQL of Big Query 【发布时间】:2017-01-24 20:08:47 【问题描述】:我正在尝试使用通配符查询 BigQuery 中的多个表(我有来自 _[0-9] 后缀的表)
对特定表的此查询有效:
SELECT
count(*)
FROM `maw_qa.rt_content_secondly_0`
where _PARTITIONTIME = timestamp('2017-01-24');
但这不是:
SELECT
count(*)
FROM `maw_qa.rt_content_secondly_*`
where _PARTITIONTIME = timestamp('2017-01-24');
错误: 查询失败 错误:无法识别的名称:_PARTITIONTIME 在 [5:7]
我正在使用标准 SQL。旧版 SQL 在查询中甚至不使用通配符 *。
正确的方法是什么?
【问题讨论】:
【参考方案1】:看起来通配符和分区在查询中不能一起工作
试试下面。它在 BigQuery Legacy SQL 中,因为在这个版本中它不那么浓密 假设您有 4 张桌子,如果更多的话 - 您需要在此处列出所有桌子
SELECT COUNT(*)
FROM
[maw_qa.rt_content_secondly_0],
[maw_qa.rt_content_secondly_1],
[maw_qa.rt_content_secondly_2],
[maw_qa.rt_content_secondly_3]
WHERE _PARTITIONTIME = TIMESTAMP('2017-01-24')
当然可以用 BigQuery 标准 SQL 编写类似的内容,但需要使用 UNION ALL 等进行更多输入。
对于标准 SQL,它可能如下所示
SELECT COUNT(*) FROM (
SELECT * FROM `maw_qa.rt_content_secondly_0` WHERE _PARTITIONTIME = TIMESTAMP('2017-01-24') UNION ALL
SELECT * FROM `maw_qa.rt_content_secondly_1` WHERE _PARTITIONTIME = TIMESTAMP('2017-01-24') UNION ALL
SELECT * FROM `maw_qa.rt_content_secondly_2` WHERE _PARTITIONTIME = TIMESTAMP('2017-01-24') UNION ALL
SELECT * FROM `maw_qa.rt_content_secondly_3` WHERE _PARTITIONTIME = TIMESTAMP('2017-01-24')
)
【讨论】:
酷!谢谢。澄清 - 我希望这将分区过滤应用于每个表。是这样吗?另外,如果需要在标准 SQL 上完成 UNION 的事情,是否会类似并在每个表上应用分区? 嗨,Mikhail,您能否举个例子,如何使用标准 SQL 来实现?我正在尝试 UNION ALL,但我是否必须在各个表中的每个选择上都有 _PARTITIONTIME 或任何其他列名?【参考方案2】:查询partitioned table 时,不需要使用_*
语法,该语法是为表通配符保留的(在_TABLE_SUFFIX
上进行过滤)。在你的情况下,你应该这样做:
SELECT
count(*)
FROM `maw_qa.rt_content_secondly`
where _PARTITIONTIME = '2017-01-24';
【讨论】:
Elliott,这些表不是模板表。因此,不带 _* 的查询会给我错误:错误:未找到:表 maw-bigquery:maw_qa.rt_content_secondly 创建带有分区的模板表会很完美。但似乎不支持在模板表上进行分区 - ***.com/questions/41817827/…以上是关于如何在 Big Query 的标准 SQL 中使用通配符为特定分区查询多个表的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL (Big Query) 中生成序列/范围/数组,其中最小值和最大值取自另一个表
如何在 Google Big Query 中正确使用 GROUP BY 命令?
BIG QUERY SQL:如何在具有相同唯一键但访问期间不同的访问中查找不同的重复集?
如何在值列中搜索特定值并在 Big Query SQL 中替换为该特定值?