Невозможно разобрать строку выражения SQL, созданную самой искрой - PullRequest
0 голосов
/ 21 декабря 2018

Я столкнулся со сценарием, в котором мне нужно преобразовать выражение 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 (которое генерируется искрой) для выражения искры?

1 Ответ

0 голосов
/ 21 декабря 2018

Метод Expression.sql:

  • Не является частью официально открытого API (как многократно указывалось разработчиками в o.a.s.sql.catalyst, код следует считать «слабо» закрытым).
  • Явно не предназначен для генерации допустимой строки SQL и может быть даже произвольной строкой ./

    Фактически contains( Страна , 'S') не действительна ни в sql (, ни в spark-sql) ни expr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...