【发布时间】:2021-03-09 04:55:35
【问题描述】:
由于在 SQL Server 中,我们可以声明像 declare @sparksql='<any query/value/string>' 这样的变量,但在 spark sql 中可以使用什么替代方法。
这样我们就不需要硬编码任何值/查询/字符串。
【问题讨论】:
标签: apache-spark apache-spark-sql databricks
由于在 SQL Server 中,我们可以声明像 declare @sparksql='<any query/value/string>' 这样的变量,但在 spark sql 中可以使用什么替代方法。
这样我们就不需要硬编码任何值/查询/字符串。
【问题讨论】:
标签: apache-spark apache-spark-sql databricks
至少从 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。
【讨论】:
如果您使用的是 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 中运行良好。集群在 Spark 3.0.1 上运行 |斯卡拉 2.12。建立小部件后,databricks 集群将在顶部列出它们并显示它们的值。这在您建立多个时会派上用场。
CREATE WIDGET TEXT tableName DEFAULT 'db.table'
SELECT * from $tableName
简短的回答是否定的,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
【讨论】: