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

时间:2018-12-21 15:21:06

标签: apache-spark apache-spark-sql

我遇到了需要将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表达式?

1 个答案:

答案 0 :(得分:1)

Expression.sql方法:

  • 它不是正式公开API的一部分(o.a.s.sql.catalyst中的开发人员代码多次声明应将其视为“弱”私有)。
  • 不是专门用于生成有效的SQL字符串,甚至可以是任意字符串。/

    实际上contains(国家, 'S')sql(或spark-sql)或expr中均无效。