如何从 Databricks 中的 SQL 语句输出创建变量
Posted
技术标签:
【中文标题】如何从 Databricks 中的 SQL 语句输出创建变量【英文标题】:How to create a variable from a SQL statement's output in Databricks 【发布时间】:2021-09-24 19:40:43 【问题描述】:我想创建一个变量,以后可以在同一笔记本中的多个 sql 查询中使用该变量。变量本身只是一个 sql 语句的整数输出,例如:
select count(people) from persons_table;
然后在后续的 sql 命令单元格中,我会简单地在计算中调用变量,例如:
select (count(cars) / $variable) as car_rate from table_x;
我在 Databricks 中使用的唯一变量是来自 Python 脚本的简单小部件 (dbutils.widgets.text('name','value'))。
我已经有一个替代方案,我有一个带有输出的临时表,但如果可能的话,我宁愿使用一个变量。
【问题讨论】:
table_x
是变量还是常量?
table_x 是一个常量表。
为什么不使用公用表表达式? docs.databricks.com/sql/language-manual/…
我可以,但想知道变量是否是一个选项。我有大约 400 个联合查询,所以我可以包装它,然后使用我猜的 CTE。
可以从 Python (***.com/questions/68794549/…) 传递,另一种可能是创建一个小部件并引用它,但我不确定效率
【参考方案1】:
我在寻找同样的问题时发现了这个。由于您的问题没有得到回答,我将把我找到的给其他人。我不确定它是不是最好的,但它确实有效。
使用 python 笔记本。
然后就可以使用python变量了。
peopleCount = spark.sql("select count(people) from persons_table").collect()[0][0]
spark.sql 将 sql 读入 pyspark 数据帧,如果您只是发送 SQL,则该变量将是一个数据帧对象。 collect 将数据帧中的结果读取到变量中。 [0][0] 是“偏移量”,但如果您有多个列或行,您只需要担心这一点。
然后在下一个单元格中
%sql
select (count(cars) / '$peopleCount') as car_rate from table_x;
%sql 告诉 databricks 这是一个 SQL 单元格,变量需要用 $ 引号括起来
【讨论】:
以上是关于如何从 Databricks 中的 SQL 语句输出创建变量的主要内容,如果未能解决你的问题,请参考以下文章
如何计算 Spark SQL(Databricks)中表中的列数?
SQL 语句中的 Databricks 错误:ParseException:不匹配的输入“Service_Date”
如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表