Как я могу получить доступ к переменной python в Spark SQL?

#pyspark #apache-spark-sql #databricks #azure-databricks

Вопрос:

У меня есть переменная python, созданная под %python в моем файле записной книжки jupyter в базе данных Azure. Как я могу получить доступ к одной и той же переменной для сравнения в %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
 
 %sql
SELECT Type , KPIDate, Value
FROM table
WHERE
RunID = RunID_Goal (This is the variable created under %python and want to compare over here)
 

Когда я запускаю это, он выдает ошибку:
Ошибка в инструкции SQL: Исключение AnalysisException: не удается разрешить « RunID_Goal заданные входные столбцы:
Я новичок в Azure databricks и spark sql, буду признателен за любую помощь.

Ответ №1:

Одним из обходных путей может быть использование виджетов для передачи параметров между ячейками. Например, на стороне 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))
 

а затем вы можете сослаться на значение из виджета внутри кода SQL:

 %sql
select * from abc where id = getArgument('my_val')
 

даст вам:

введите описание изображения здесь

Другой способ — передать переменную через конфигурацию Spark. Вы можете установить значение переменной следующим образом (пожалуйста, обратите внимание, что переменная должна иметь префикс — в данном случае это c. ):

 spark.conf.set("c.var", "some-value")
 

а затем из SQL обратитесь к переменной как ${var-name} :

 %sql 
select * from table where column = '${c.var}'
 

Одним из преимуществ этого является то, что вы можете использовать эту переменную также для имен таблиц и т. Д. Недостатком является то, что вам нужно выполнить экранирование переменной, например, заключить строковые значения в одинарные кавычки.

Ответ №2:

Вы не можете получить доступ к этой переменной. Это объясняется в документации:

При вызове команды language magic команда отправляется в REPL в контексте выполнения для записной книжки. Переменные, определенные на одном языке (и, следовательно, в REPL для этого языка), недоступны в REPL другого языка. Реплики могут совместно использовать состояние только через внешние ресурсы, такие как файлы в DBFS или объекты в хранилище объектов.

Ответ №3:

Вот еще один обходной путь.

 # Optional code to use databricks widgets to assign python variables
dbutils.widgets.text('my_str_col_name','my_str_col_name')
dbutils.widgets.text('my_str_col_value','my_str_col_value')
my_str_col_name = dbutils.widgets.get('my_str_col_name')
my_str_col_value = dbutils.widgets.get('my_str_col_value')

# Query with string formatting
query = """
select *
from my_table
where {0} < '{1}'
"""

# Modify query with the values of Python variable 
query = query.format(my_str_col_name,my_str_col_value)

# Execute the query
display(spark.sql(query))