在使用计划查询运行 BigQuery 作业之前处理多个条件

Posted

技术标签:

【中文标题】在使用计划查询运行 BigQuery 作业之前处理多个条件【英文标题】:Handle multiple conditions before running a BigQuery job using a scheduled query 【发布时间】:2021-12-09 07:38:56 【问题描述】:

我计划在 BigQuery 中安排一个查询,它会在其中运行一些查询以首先检查某些条件。然后,如果所有条件都通过,它将运行聚合查询。

我现在能想到的就是做这样的事情:

declare A default (select count(*) from mydataset.mytable);  --SELECT query to get a value
declare B ...
declare C ... 
. . . -- get all of the value into a variable

-- Then use if-else condition e.g.
if A > 100 and B = C+D+E and B = F and ...
then
   -- run an aggregation queries
else
   select "not pass the condition"; -- don't run anything
end if; 

这种方式是可行的,但我想让它在不满足某些条件时更加明显。我可以稍后查看哪些条件未通过。在计划查询中运行时有什么想法可以改善这一点吗?

【问题讨论】:

您的所有条件 (A,B,...) 是否都返回整数?如果你想具体知道哪个条件没有通过,你必须做多个 if-self 而不是使用 ands 。你试过这个吗? @ewertonvsilva 还没有尝试过,但似乎很有趣。现在我只是在 else 条件下使用RAISE USING MESSAGE,如果它没有通过所有它就会出错。我想我可以调整你的想法来过滤每个条件,例如如果 A != B,则使用消息“A 不等于 B”等引发。 【参考方案1】:

结合使用 raise 和多个条件测试来指定具体错误,您可以使用以下内容:

BEGIN
    DECLARE A DEFAULT (SELECT COUNT(*) FROM `ds.table`);
    DECLARE B DEFAULT (SELECT COUNT(*) FROM `ds.table`);

    DECLARE C1 DEFAULT A>1;
    DECLARE C2 DEFAULT B>A;

    IF C1 AND C2 THEN
        SELECT "Execute Query";
    ELSE 
        IF NOT (C1) THEN raise USING message="Condition 1 failed"; END IF;
        IF NOT (C2) THEN raise USING message="Condition 2 failed"; END IF;
    END IF; 

EXCEPTION WHEN ERROR THEN 
    SELECT @@error.message;
END;

但如果您有多个失败条件,最好使用选择:


    DECLARE A DEFAULT (SELECT COUNT(*) FROM `ds.table`);
    DECLARE B DEFAULT (SELECT COUNT(*) FROM `ds.table`);

    DECLARE C1 DEFAULT A>10;
    DECLARE C2 DEFAULT B>A;

    IF C1 AND C2 THEN
        SELECT "Execute Query";
    ELSE 
        IF NOT (C1) THEN select "Condition 1 failed"; END IF;
        IF NOT (C2) THEN select "Condition 2 failed"; END IF;
    END IF; 

【讨论】:

是的,如果它失败了,很可能多个条件都会失败。通过第二种方式,查询仍然会成功运行。我们可以一些如何连接所有失败的条件并在最后提出? 哦,我只是认为我们可以声明一个结果变量(默认为 Null),然后如果有一个失败的条件,我可以设置一个变量并连接自己,最后检查这个变量是否仍然为 null不是(意味着发生了一些失败的情况)然后引发错误

以上是关于在使用计划查询运行 BigQuery 作业之前处理多个条件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apps 脚本运行不将结果写入表的 BigQuery 作业?

BigQuery 计划查询(脚本)循环:需要保存目标表,但由于设置了目标表,运行失败

BigQuery 作业统计信息不完整或作业完成后待处理任务的原因

如何在 Google Bigquery 中触发按需计划查询

BigQuery 中的查询作业中的 allowLargeResults

如何获取在 BigQuery 命令行工具中运行的最后一个作业的作业 ID?