BigQuery中独立作业间共享变量声明查询结果的可行性
BigQuery里复用会话变量的解决办法
几种可行思路
1. 用临时表存变量值
把声明好的变量写到会话级临时表(前缀_tmp_)里,后面的查询直接从这张表读就行。临时表只在当前会话有效,会话结束自动删除,刚好匹配你每次会话变量变更的需求。
- 声明查询示例:
DECLARE start_date DATE; DECLARE end_date DATE; SET start_date = DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY); SET end_date = CURRENT_DATE(); -- 把变量写入临时表 CREATE OR REPLACE TEMP TABLE session_vars AS SELECT start_date, end_date;
- 数据检索查询示例:
-- 从临时表取变量 DECLARE start_date DATE; DECLARE end_date DATE; SELECT start_date, end_date INTO start_date, end_date FROM session_vars; -- 业务查询逻辑 SELECT * FROM `project.dataset.table` WHERE date BETWEEN start_date AND end_date;
2. 把所有逻辑放同一个脚本里
把变量声明和所有数据检索查询写到同一个BigQuery脚本里,变量在整个脚本会话里都有效,不用每次重复声明。比如:
DECLARE start_date DATE; DECLARE end_date DATE; SET start_date = DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY); SET end_date = CURRENT_DATE(); -- 第一个数据查询 SELECT * FROM `project.dataset.table1` WHERE date BETWEEN start_date AND end_date; -- 第二个数据查询 SELECT COUNT(*) FROM `project.dataset.table2` WHERE date >= start_date;
要是需要单独执行某段查询,可以把脚本拆成带变量声明的片段,或者用EXECUTE IMMEDIATE动态执行,不过得保证变量在当前会话里已经存在。
3. 用UDF封装变量计算逻辑
如果变量的计算逻辑固定,只是每次会话的输入参数变化,可以把变量生成逻辑做成UDF,每次调用传参数就行:
CREATE OR REPLACE FUNCTION `project.dataset.get_session_vars`(offset_days INT64) RETURNS STRUCT<start_date DATE, end_date DATE> AS ( STRUCT( DATE_SUB(CURRENT_DATE(), INTERVAL offset_days DAY), CURRENT_DATE() ) );
然后查询里调用这个UDF拿变量:
DECLARE vars STRUCT<start_date DATE, end_date DATE>; SET vars = `project.dataset.get_session_vars`(7); SELECT * FROM `project.dataset.table` WHERE date BETWEEN vars.start_date AND vars.end_date;
这种适合变量生成逻辑固定,只是参数不同的场景,不用每次写重复的声明代码。
为啥已保存查询不行?
已保存查询是静态的,参数得预先定义好且固定,没法直接复用会话里动态生成的变量值,所以不适合你的场景。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

