我遇到了需要将spark表达式转换为sql表达式,后来需要将sql表达式解析回spark表达式的情况。在大多数情况下,它可以正常工作,但在某些情况下,它会引发错误。
例如,以下操作在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生成)以生成spark表达式?
答案 0 :(得分:1)
Expression.sql
方法:
o.a.s.sql.catalyst
中的开发人员代码多次声明应将其视为“弱”私有)。不是专门用于生成有效的SQL字符串,甚至可以是任意字符串。/
实际上contains(
国家, 'S')
在sql
(或spark-sql
)或expr
中均无效。