如何在Databricks中基于SQL语句输出创建变量供后续查询使用
Databricks Notebook跨SQL单元格复用动态查询变量方案
方案1:Spark配置参数传递(全版本通用,无需额外依赖)
直接将SQL查询结果写入Spark会话配置,所有后续单元格可直接调用:
- 第一步:运行Python单元格获取查询结果并写入配置
# 执行目标SQL拿到整数值 people_count = spark.sql("select count(people) from persons_table").collect()[0][0] # 写入Spark全局配置,变量名可自定义,建议加统一前缀避免冲突 spark.conf.set("custom.vars.people_count", people_count)
- 第二步:任意后续SQL单元格直接调用变量,使用
${变量名}格式即可
select (count(cars) / ${custom.vars.people_count}) as car_rate from table_x;
方案2:dbutils.widgets动态更新(和你已掌握的widget用法兼容)
无需手动输入参数值,可通过代码动态修改widget的默认值:
- 先运行Python单元格更新widget值
# 初始化widget(如果之前没有创建的话) dbutils.widgets.text("people_count", "0") # 查询得到结果后更新widget值 people_count = spark.sql("select count(people) from persons_table").collect()[0][0] dbutils.widgets.text("people_count", str(people_count))
- 后续SQL调用方式和你常用的格式一致
select (count(cars) / $people_count) as car_rate from table_x;
方案3:SQL原生变量声明(仅适用于Databricks Runtime 12.2及以上版本)
不需要写Python代码,纯SQL即可完成变量声明赋值:
- 在SQL单元格中声明并赋值变量
-- 声明变量类型 DECLARE people_count INT; -- 用SQL查询结果给变量赋值 SET VAR people_count = (select count(people) from persons_table);
- 后续SQL单元格直接调用变量名即可
select (count(cars) / people_count) as car_rate from table_x;
注意事项
- 以上所有方案的变量都仅在当前Spark会话生效,集群重启、notebook和集群分离后需要重新运行赋值代码
- 如果传递的是字符串类型变量,SQL调用时需要用引号包裹:
'${custom.vars.str_variable}'
内容的提问来源于stack exchange,提问作者Isolated
相关产品推荐
相关产品推荐

