【问题标题】:How can I access python variable in Spark SQL?如何在 Spark SQL 中访问 python 变量?
【发布时间】:2021-10-18 00:23:28
【问题描述】:

我在 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
%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: cannot resolve 'RunID_Goal' given input columns: 我是新的 azure databricks 和 spark sql 任何形式的帮助将不胜感激。

【问题讨论】:

    标签: pyspark apache-spark-sql databricks azure-databricks


    【解决方案1】:

    一种解决方法是使用Widgets 在单元格之间传递参数。例如,在 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】:

      您无法访问此变量。在documentation中有解释:

      当您调用语言魔术命令时,该命令会分派到笔记本执行上下文中的 REPL。用一种语言定义的变量(因此在该语言的 REPL 中)在另一种语言的 REPL 中不可用。 REPL 只能通过外部资源共享状态,例如 DBFS 中的文件或对象存储中的对象。

      【讨论】:

        猜你喜欢
        • 2017-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-05
        • 1970-01-01
        • 2023-02-15
        • 1970-01-01
        相关资源
        最近更新 更多