【问题标题】:How to use variables in SQL queries?如何在 SQL 查询中使用变量?
【发布时间】:2021-03-09 04:55:35
【问题描述】:

由于在 SQL Server 中,我们可以声明像 declare @sparksql='<any query/value/string>' 这样的变量,但在 spark sql 中可以使用什么替代方法。 这样我们就不需要硬编码任何值/查询/字符串。

【问题讨论】:

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


    【解决方案1】:

    至少从 2.1.x 版本开始,Spark 支持变量替换。它由配置选项spark.sql.variable.substitute 控制 - 在3.0.x 中默认设置为true(您可以通过执行SET spark.sql.variable.substitute 来检查它)。

    将该选项设置为true,您可以使用SET myVar=123 将变量设置为特定值,然后使用${varName} 语法使用它,例如:select ${myVar}...

    在 Databricks 上,解析器也可以识别该语法,并创建一个字段来填充值,尽管使用 SQL 中的小部件会更容易,如 documentation 中所述

    附:根据code,除了变量本身,它还支持从环境变量和Java系统属性中获取数据,如下所示:

    select '${env:PATH}';
    select '${system:java.home}';
    

    附:这个答案是关于使用 Spark SQL 本身中定义的变量。如果您想在 Spark SQL 中使用 Python/Scala 中定义的变量,请参考this answer

    【讨论】:

      【解决方案2】:

      如果您使用的是 Databricks Notebook,那么一种简单的方法是使用 Scala 或 Python 来声明变量并执行 SQL 语句。

      这是一个简单的 Scala 示例:

      val x = 1
      
      val df = spark.sql(s"select * from t where col1 = $x")
      
      df.show()
      

      【讨论】:

      • 是的,谢谢你,我正在使用databricks,但我的一个纯粹基于spark sql(仅使用sql查询),所以任何替代方案都会很棒。我已经尝试过使用小部件选项但我还发现了人工干预。
      • @Shrinc 查看我对该主题的回答。
      【解决方案3】:

      以下小部件简单解决方案在 Databricks Spark SQL 中运行良好。集群在 Spark 3.0.1 上运行 |斯卡拉 2.12。建立小部件后,databricks 集群将在顶部列出它们并显示它们的值。这在您建立多个时会派上用场。

      CREATE WIDGET TEXT tableName DEFAULT 'db.table'
      
      SELECT * from  $tableName
      
      【解决方案4】:

      简短的回答是否定的,Spark SQL 目前不支持变量。

      SQL Server 使用 T-SQL,它基于 SQL 标准扩展了过程编程、局部变量和其他特性。

      Spark SQL 是纯 SQL,部分兼容 SQL 标准。 从 Spark 3.0 开始,Spark SQL 引入了两个实验选项以符合 SQL 标准,但没有引入变量支持。

      https://spark.apache.org/docs/latest/sql-ref-ansi-compliance.html
      

      【讨论】:

        猜你喜欢
        • 2019-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-16
        • 1970-01-01
        • 2019-08-18
        相关资源
        最近更新 更多