有啥方法可以在 BigQuery 标准 SQL 脚本中遍历数据集中的所有表?
Posted
技术标签:
【中文标题】有啥方法可以在 BigQuery 标准 SQL 脚本中遍历数据集中的所有表?【英文标题】:Any way to loop through all tables in a dataset in a BigQuery standard SQL script?有什么方法可以在 BigQuery 标准 SQL 脚本中遍历数据集中的所有表? 【发布时间】:2020-01-21 11:29:48 【问题描述】:我在一个数据集中有许多每日表格(以 _YYYYMMDD 后缀命名)。我需要编写一个每日计划查询来遍历每个每日表,与另一个动态变化的表执行连接,并在 BigQuery 中覆盖当天的表。我正在研究“标准 SQL 中的脚本”,想知道是否有办法在循环中迭代 _YYYYMMDD 表?
https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting
提前致谢!
【问题讨论】:
【参考方案1】:我建议您使用通配符表,它允许您将标准 SQL 中的某些功能与 BigQuery 结合使用。您可以阅读更多内容并查看一些示例here。
此外,您要查找的语法应该类似于:
SELECT
#columns that you want
FROM
`<project-id>.<dataset-id>.<table-prefix>*`
星号表示选择将扫描哪些表,在这种情况下,每个表都具有相同的前缀。另一方面,您也可以使用 _TABLE_SUFFIX 来限制对表的扫描,您可以阅读更多关于它的信息here。此外,下面还有一个示例:
SELECT
ROUND((max-32)*5/9,1) celsius
FROM
`bigquery-public-data.noaa_gsod.gsod19*`
WHERE
_TABLE_SUFFIX = (SELECT SUBSTR(MAX(table_id), LENGTH('gsod19') + 1)
FROM `bigquery-public-data.noaa_gsod.__TABLES_SUMMARY__`
WHERE table_id LIKE 'gsod194%')
希望对你有帮助。
回答更新(在用户 cmets 之后):
BigQuery 中有一个名为 UPDATE 的方法,它允许用户从数据集中的某些列中更新数据。在您的情况下,这可能是一个合适的解决方案。使用更新的语法如下:
UPDATE sample_db.UserSessions
SET ip_address = REGEXP_REPLACE(ip_address, r"(\.[0-9]+)$", ".0")
WHERE TRUE
【讨论】:
感谢您的回复。抱歉,如果我的问题不清楚:当前数据集由 _YYYYMMDD 前缀分解的通配符表组成。例如:dataset_20200101、dataset_20200102 等。我的要求是:从这些嵌套的通配符表中获取每个单独的每日表,与另一个表(每天更新)执行连接,并用这个新表覆盖原始表。我需要在 60 多个通配符表上执行此操作,并想知道是否有任何简单的方法可以循环遍历在 YYYYMMDD 上参数化的多个通配符表。 P.S.我还可以编写一些 Python 代码来帮助解决这个问题(就目前使用 pandas_gbq 但计划迁移到 BigQuery Python 客户端库的工具而言)。因此,如果有一种经济高效的方法可以通过 Python Cloud Function 来实现这一点,那也会很有趣。 @mrag,当你说“覆盖原表”时,这是哪个表?您有带有时间戳后缀的每日表格和将由这些表格值上传的表格。我做对了吗? 是的,没错。所以同一个数据集中有两个表。一个“表”由 60 多个带有 _YYYMMDD 后缀的嵌套通配符表组成。其他表包含单个表。两者每天都独立更新。我需要从第一个表中取出每个单独的 _YYYYMMDD 表,加入第二个表,然后覆盖第一个 _YYYYMMDD 表。希望这更清楚。很抱歉造成混乱。理想情况下,我只会更新每天受影响的相关行,但由于 BigQuery 不允许更新单个行,我必须删除和替换整个表。 @mrag,感谢您的回复。我正要问你,你真的需要覆盖所有内容吗?因为 BigQuery 中有一个 UPDATE 方法,您可以在其中更新数据集的列。链接:cloud.google.com/bigquery/docs/updating-data以上是关于有啥方法可以在 BigQuery 标准 SQL 脚本中遍历数据集中的所有表?的主要内容,如果未能解决你的问题,请参考以下文章
在 BigQuery 中使用 dryRun 区分标准和旧版 SQL 查询的替代方法?
在链接到 BigQuery 之前,有啥方法可以访问 Firebase 原始事件数据?