带有 BigQuery 的动态表后缀不限制处理的数据

Posted

技术标签:

【中文标题】带有 BigQuery 的动态表后缀不限制处理的数据【英文标题】:Dynamic table suffix with BigQuery does not limit processed data 【发布时间】:2020-04-02 03:50:25 【问题描述】:

我一直在尝试从特定表中动态选择以减少总处理数据。当过滤器按如下方式手动设置时,使用 _TABLE_SUFFIX 似乎有效

请注意,此处不能选择声明的变量,这是使用 BigQuery 网页界面的计划查询,使用声明的变量似乎会阻止保存输出表。

SELECT * FROM SOME_TABLE
WHERE _TABLE_SUFFIX BETWEEN "20200101" and FORMAT_DATE("%Y%m%d", CURRENT_DATE())

>>> 50MB PROCESSED

但是,根据其他表动态设置 _TABLE SUFFIX 似乎会进行全表扫描。注意这里选择的值是一样的。

SELECT * FROM SOME_TABLE
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE("%Y%m%d", (SELECT MAX(date) FROM OTHER TABLE)) and FORMAT_DATE("%Y%m%d", CURRENT_DATE())

>>> 350mb PROCESSED

【问题讨论】:

那么,问题是什么 - 上述行为是众所周知的事实。 Filters on _TABLE_SUFFIX that include subqueries cannot be used to limit the number of tables scanned for a wildcard table. - 更多详情请参阅Filtering selected tables using _TABLE_SUFFIX 【参考方案1】:

如果您的表是集群的,这根本不是问题。

见:

https://***.com/a/60895770/132438

现在,如果您想限制为这些表查询的数据量,您可以使用脚本:

DECLARE begin_date STRING 
  DEFAULT (FORMAT_DATE("%Y%m%d", (SELECT MAX(date) FROM OTHER TABLE)));

SELECT * FROM SOME_TABLE
WHERE _TABLE_SUFFIX BETWEEN begin_date and FORMAT_DATE("%Y%m%d", CURRENT_DATE())

【讨论】:

这很有用,但不幸的是,谷歌集成(Firebase)默认为分片而不是分区表。我假设将它们转储到完整表中的预定查询可能是当时的方法。至于 DECLARED 变量,这些变量似乎与 BigQuery 计划查询不匹配。 想通了。 BQ 不能很好地处理声明的变量和附加到带有预定查询的表。这需要显式地插入到表中。 哦,怎么不好看?我们应该将其添加到功能请求、错误或 SO 问题中吗? 基本上,我注意到在典型的单查询情况下,BigQuery 的预定查询 API 包括“输出表”选项,以及覆盖/附加选项。声明任何变量都会删除此功能,并且需要显式 INSERT/CREATE OR REPLACE/etc 来创建/修改现有表

以上是关于带有 BigQuery 的动态表后缀不限制处理的数据的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 在 UI 上复制表格 - 不复制所有表格

如何在 Google bigquery 中为多个动态表创建授权视图?

Bigquery如何在List操作期间过滤数据集中的表

Google BigQuery - 插入所有表后缀失败

将列动态添加到现有 BigQuery 表

BigQuery 行限制