【发布时间】:2022-01-04 12:16:55
【问题描述】:
我正在尝试在符合此条件的分区表之间建立联合:
#standardSQL
SELECT table_name
FROM `project.dataset`.INFORMATION_SCHEMA.TABLES
WHERE SAFE.PARSE_DATE('%Y%m%d', RIGHT(table_name, 8))
BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AND CURRENT_DATE()
ORDER BY creation_time DESC;
示例输出:
daily_20220104
daily_20220103
daily_20220101
daily_20211231
这些是我要合并的表的名称。如您所见,有时会出现时间间隔。
我正在考虑将这个列变成一个数组,然后弄清楚如何迭代它,或者最终迭代一个表,其中包含一个列,我缺乏在 SQL 中做这件事的经验。
我的最终目标是将它用作子查询。它也将被放置在 Apache Airflow 中。我也可以编写一些 Python 代码来检索它,我愿意接受建议。 我最喜欢的解决方案包括一个 SQL FOR 循环,如
FOR row in rows DO
INSERT INTO temporary_table (
SELECT *
FROM project.dataset.row
);
END FOR;
【问题讨论】:
-
您能否为您的表格提供一些示例数据以及预期的表格输出,因为这将有助于复制。
-
@Sandeep Mohanty daily_xxxxxxxx 表包含时间戳字段、公司名称、事件类型
-
1.- 这是您每周都会运行的流程吗? 2.- 你的目标是与所有其他表的联合拥有一个决赛桌?
-
@Alvaro 1.- 此过程将每 3 天运行一次,并且每次将扫描 7 天前的表。 2. - 是的,稍后在查询中这个联合将作为一个表来查询,它不是程序的最终产品。无论如何,我设法做的是对分区表进行循环并将结果附加到临时表。不过我觉得效率不高。
-
@dariuszewski 根据您的评论,我会做类似的事情。基本上,每 3 天使用 execution_date (ds) 我将在 Airflow 的 DAG 中创建 7 个分支,首先检查表是否存在(例如 BigQueryCheckOperator)。如果是这样,那么我会得到它并将其附加到临时表中。最后,您甚至可以应用重复数据删除或类似功能。你觉得这有意义吗?
标签: sql google-bigquery airflow union partitioning