在使用计划查询运行 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 而不是使用 and
s 。你试过这个吗?
@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 作业统计信息不完整或作业完成后待处理任务的原因