如何从 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中创建表

如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表

如何从 spark sql databricks 中的临时视图或等效视图中删除?

在 Python 中读取 SQL 文件以通过 databricks 对 JDBC 运行