【问题标题】:Declare Big Query Variable with Scheduled Query and Destination Table使用计划查询和目标表声明大查询变量
【发布时间】:2020-02-23 15:20:56
【问题描述】:

我在 Big Query 中使用计划查询,它将前一天的数据附加到 Big Query 表中。当我的查询运行时,前一天的数据并不总是可用,因此,为了确保我拥有所有数据,我需要计算我的 Big Query 表中可用的最后日期。

我的第一次尝试是编写以下查询:

SELECT *
FROM sourceTable
WHERE date >= (SELECT Max(date) from destinationTable)

当我运行这个查询时,只有 date >= max(date) 被正确导出。但是,查询会处理整个 sourceTable,而不仅仅是 J - max(date)。因此,成本高于预期。

我还尝试使用“DECLARE”和“SET”(https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting)声明一个变量。此解决方案工作正常,仅处理 J - max(date)。但是,BQ 将带有“DECLARE”的查询解释为脚本,因此无法使用预定查询将结果自动导出到 BQ 表中。

DECLARE maxDate date;
SET maxDate = (SELECT Max(date) from destinationTable); 
SELECT *
FROM sourceTable
WHERE date >= maxDate

还有其他方法可以做我想做的事吗?或者在带有目标表的计划查询中使用“DECLARE”和“SET”声明变量的方法?

谢谢!

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    destinationTable 是否已分区?如果没有,您可以将其重新创建为分区表吗?如果它是一个分区表,并且在 destinationTable.date 列上分区,您可以执行以下操作:

    SELECT *
    FROM sourceTable
    WHERE date >= (SELECT MAX(_PARTITIONTIME) from destinationTable)
    

    由于_PARTITIONTIME 是伪列,运行子查询没有成本。

    【讨论】:

    • 您好,我已经根据您的建议测试了按“日期”将destinationTable 重新创建为分区表。 sourceTable 是日期分片表,destinationTable 是日期分区表。这是我尝试过的代码:SELECT * FROM sourceTable WHERE PARSE_DATE('%y%m%d',_table_suffix) > (SELECT MAX(date) FROM destinationTable )。这个查询仍然处理整个源表,而它应该只处理一天的数据。我是不是做错了什么?
    • 嗨@ThibaultC,你找到解决方案了吗?我确实有确切的要求。
    • 我想我找到了答案,贴在下面。
    【解决方案2】:

    脚本查询在计划时暂时不支持设置目标表。您需要使用 DDL/DML 对现有表进行更改。

    DECLARE maxDate date;
    
    SET maxDate = (SELECT Max(date) from destinationTable); 
    
    CREATE OR REPLACE destinationTable AS
      SELECT *
      FROM sourceTable
      WHERE date >= maxDate
    

    【讨论】:

      【解决方案3】:

      我们仍然不能在 BigQuery 中使用计划脚本和目标表。

      但是,如果您的源表是日期分片的,那么可以使用一种解决方法来实现所需的解决方案(仅需要基于另一个表的初始值进行数据扫描)。

      SELECT
        *
      FROM
        sourceTable*
      WHERE
        _TABLE_SUFFIX >= (
        SELECT
          IFNULL(MAX(date),
            '<default_date>')
        FROM
          destinationTable)
      

      这将只扫描大于或等于目标表最大日期的分片。

      附注- 源表是日期分片的。

      【讨论】:

        猜你喜欢
        • 2023-02-02
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 2020-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        相关资源
        最近更新 更多