我遇到了一个场景,我需要将火花表达式转换为sql表达式,稍后需要将sql表达式解析回Spark表达式。在大多数情况下,它可以正常工作,但在某些情况下它会引发错误。
例如,以下在火花中工作正常
val sqlContext = spark.sqlContext
import sqlContext.implicits._
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
val df = Seq("Britain", "Germany", "USA", "Russia", "Japan").toDF("Country")
val japan = 'Country === "Japan"
df.filter(japan).show
val sqlExp = japan.expr.sql
println(sqlExp) // output: (`Country` = 'Japan')
df.filter(expr(sqlExp)).show
但是当我尝试使用以下表达式时,它失败了:
val expression = 'Country.contains("S")
println(expression.expr.sql)
df.filter(expression).show
val parsedExpression = expr(expression.expr.sql) //output: contains(`Country`, 'S')
df.filter(parsedExpression).show
似乎它仅适用于标准 sql 语法。当我使用expr("country LIKE '%S%'")
时,它能够解析。
有没有办法解析回这样的 sql 表达式(由 Spark 生成)以激发表达式?
Expression.sql
方法:
- 不是正式公共 API 的一部分(正如开发人员代码多次指出的那样
o.a.s.sql.catalyst
应该被认为是"弱"私有的)。 -
不明确用于生成有效的 SQL 字符串,甚至可以是任意字符串。
事实上
contains(
国家, 'S')
在sql
(或spark-sql
)和expr
都无效。