#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))