如何在 Spark SQL 中访问 python 变量?

Has*_*han 2 apache-spark apache-spark-sql pyspark databricks azure-databricks

我在 Azure Databricks 中的 jupyter 笔记本文件中的 %python 下创建了 python 变量。如何访问相同的变量以在 %sql 下进行比较。下面是示例:

%python

RunID_Goal = sqlContext.sql("SELECT CONCAT(SUBSTRING(RunID,1,6),SUBSTRING(RunID,1,6),'01_') 
FROM RunID_Pace").first()[0] 
AS RunID_Goal
Run Code Online (Sandbox Code Playgroud)
%sql
SELECT Type , KPIDate, Value
FROM table
WHERE
RunID = RunID_Goal (This is the variable created under %python and want to compare over here)
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,它会抛出错误: SQL 语句中的错误: AnalysisException:无法解析RunID_Goal给定输入列的“ ”:我是新的 azure databricks 和 Spark sql 任何形式的帮助将不胜感激。

Ale*_*Ott 6

一种解决方法是使用小部件在单元格之间传递参数。例如,在 Python 端可能如下所示:

# generate test data
import pyspark.sql.functions as F
spark.range(100).withColumn("rnd", F.rand()).write.mode("append").saveAsTable("abc")

# set widgets
import random
vl = random.randint(0, 100)
dbutils.widgets.text("my_val", str(vl))
Run Code Online (Sandbox Code Playgroud)

然后您可以在 SQL 代码中引用小部件中的值:

%sql
select * from abc where id = getArgument('my_val')
Run Code Online (Sandbox Code Playgroud)

会给你:

在此输入图像描述

另一种方法是通过 Spark 配置传递变量。您可以像这样设置变量值(请注意,变量应该有一个前缀 - 在本例中是c.):

spark.conf.set("c.var", "some-value")
Run Code Online (Sandbox Code Playgroud)

然后从 SQL 中将变量引用为${var-name}

%sql 
select * from table where column = '${c.var}'
Run Code Online (Sandbox Code Playgroud)

这样做的优点之一是您也可以将此变量用于表名等。缺点是您需要对变量进行转义,例如为字符串值放入单引号。