【问题标题】:Unionize partitioned tables matching criteria合并符合条件的分区表
【发布时间】: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


【解决方案1】:

我设法解决了这个问题:

DECLARE varI INT64;
DECLARE varJ INT64;
DECLARE varTbl STRING;

SET varI = 1;

SET varJ = (
    SELECT count(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()
);

CREATE TEMPORARY TABLE ResultOneWeek (company_name INT64, date DATE);

WHILE varI <= varJ DO
    SET varTbl = (
        WITH availableReports AS (
            SELECT table_name, ROW_NUMBER() OVER(ORDER BY creation_time DESC) AS rn
            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()
        )
        SELECT RIGHT(table_name, 8)
        FROM availableReports
        WHERE rn = varI
    );

    INSERT INTO ResultOneWeek (
        SELECT DISTINCT company_name, reportDate
        FROM `project.dataset.daily_*`
        WHERE _TABLE_SUFFIX = varTbl
    );
    
    SET varI = varI + 1;
END WHILE;

--final query
SELECT *some_tables 
FROM other_table o
INNER JOIN ResultOneWeek r
ON *some_keys;

但我认为效率不会是这种方法的重要组成部分。

【讨论】:

    猜你喜欢
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2016-02-08
    • 2013-01-12
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多