google bigquery 使用通配符表查询表集

Posted

技术标签:

【中文标题】google bigquery 使用通配符表查询表集【英文标题】:google bigquery Querying sets of tables using wildcard tables 【发布时间】:2018-07-18 20:00:25 【问题描述】:

我有 100 多个具有以下命名约定的表。

click001
click001_meta
click002
click002_meta
click003
click003_meta
click004
click004_meta
.........
.........
click00n
click00n_meta

我想在 bigquery(标准)中使用通配符表查询这些表,不包括 *_meta 表。结果集只能来自 (click001,click002,click003..click00n)

我已经尝试过类似的方法,但结果仍然有来自 *meta 表的数据。

SELECT _TABLE_SUFFIX as tp, *
FROM `abc.clicks*`
WHERE NOT REGEXP_CONTAINS(_TABLE_SUFFIX, "_[a-zA-Z][a-zA-Z][a-zA-Z][a-zA-Z]") 

我们有标准方言的解决方案吗?

【问题讨论】:

我投票结束这个问题,因为没有发现任何问题。更多信息请访问issuetracker.google.com/issues/111659626 感谢您的帮助。您是否有建议/解决方案仅使用通配符搜索从 click00n 而不是从 click00n_meta 获取结果? 您没有从“元”表中获得任何结果。架构是,但这些表中没有行进入。 未来有两个选择:您可以不使用“*”扩展,也可以在 BQ 问题跟踪器上输入功能请求“请在 * 扩展后过滤表之前不要确定架构” 对不起。实际结果显示元表中的数据与 click00n 表具有不同的架构。目前,我假设通配符表搜索功能处于故障或不完整状态,无法在生产中使用,我选择您的首选。在那个问题跟踪器上,我已要求他们提供您建议的功能。感谢您提供帮助,感谢您的时间和努力。 【参考方案1】:

在正则表达式中,_ 表示“任何字符”,而不是下划线,因此您可能需要使用反斜杠转义下划线。或者,您可能只使用带有LIKE 的过滤器:

SELECT _TABLE_SUFFIX as tp, *
FROM `abc.clicks*`
WHERE _TABLE_SUFFIX NOT LIKE '%meta'

【讨论】:

没有按预期工作。查询输出仍然显示来自 click00x_meta 的数据。谢谢! 那么……那么查询结果中tp的值是多少呢? 例如,我可以看到 tp 为 002。输出来自 click002_meta。 与我的回答中的评论相同 - 对于 click002_meta,它将是 002_meta。所以如果你只看到 002 - 这意味着相应的表格是 click002 SELECT _TABLE_SUFFIX tp, count(1) cnt FROM abc.clicks* WHERE REGEXP_CONTAINS(_TABLE_SUFFIX, r'\d$') group by _TABLE_SUFFIX 根据假设,此查询仅返回 clicksnnn 表的计数,但输出计数来自 clicksnnn +clicksnnn_meta。【参考方案2】:
#standardSQL
SELECT _TABLE_SUFFIX as tp, *
FROM `abc.click*`
WHERE REGEXP_CONTAINS(_TABLE_SUFFIX, r'\d$')

【讨论】:

谢谢,我仍然有相同的结果。 '\d$' 代表什么? 1) 没有办法得到相同的结果——你做的其他事情超出了你的问题——请验证!!! 2) '\d$' 表示'字符串末尾的数字' 谢谢米哈伊尔。问题是_TABLE_SUFFIX。例如,_TABLE_SUFFIX 为 clicks003 和 clicks0003_meta 返回 003 谢谢。逻辑上是正确的。但是如果我在 tp 之后指定 *,它会从 _meta 表中返回数据。也许这是一个很大的查询错误。 您是说您对这一切仍有疑问(即使在逻辑上它是正确的)?让我们知道 - 如果是这样,我们不需要弄清楚如何解决您的问题【参考方案3】:

关于进一步调查(见https://issuetracker.google.com/issues/111659626)

问题抱怨“我看到了排除表中的数据”,但真正发生的是“我看到了排除表中的列”。发生这种情况是因为首先确定了架构 - 但没有数据通过过滤器。


你能运行这个测试吗:

SELECT _table_suffix ts 
FROM `abc.clicks*` 
WHERE _table_suffix NOT LIKE '%meta' 
GROUP BY 1

这就是您排除“元”表所需的全部内容。如果查询结果带来任何带有“meta”后缀的表,请回复作业id提交bug。

【讨论】:

不,它没有用。 Mikhail Berlyant/Elliott 分享了类似的意见。 Job ID blink-194619:US.bquijob_6f8c6005_164b45eb5ca SELECT _TABLE_SUFFIX as tp, * FROM aetna.click* WHERE _TABLE_SUFFIX NOT LIKE '%meta' 等等...你告诉我们查询返回了一些行,字符串以'meta'结尾??? (我不能亲自查看工作 ID,但工作 ID 会帮助可以的人) (如需查看job id,请在issuetracker.google.com/issues/…添加issue) 这里我们讨论的是通配符表,而不是实际的行。根据您的逻辑,我们不应该看到来自 _meta* 表的记录。但实际上,它从 _meta* 表中获取数据。 那么该报告带有该错误 ID 的错误报告了!检查此问题的最佳方法

以上是关于google bigquery 使用通配符表查询表集的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 能否在 Google Cloud Storage 中基于 CSV 文件的外部表中使用通配符?

BigQuery 通配符表 - 有啥限制?

Bigquery 使用 Union All 和通配符删除查询

bigquery 通配符表查询不允许选择某些字段

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

带有日期列的 BigQuery 标准 SQL 表通配符