如何在 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 中替换为该特定值?

如何使用 Big Query SQL Standard 将日期 YYYY-MM-DD 转换为字符串 YYYYMM?

如何将 Google Cloud SQL 与 Google Big Query 集成