无法解析 Spark 本身生成的 SQL 表达式字符串



我遇到了一个场景,我需要将火花表达式转换为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都无效。

相关内容

  • 没有找到相关文章

最新更新