如何在不执行的情况下验证 Spark SQL 表达式?

Man*_*hra 9 apache-spark apache-spark-sql

我想验证 spark-sql 查询在语法上是否正确,而无需在集群上实际运行查询。

实际用例是我正在尝试开发一个用户界面,它接受用户输入 spark-sql 查询,我应该能够验证所提供的查询在语法上是否正确。此外,如果在解析查询后,我可以就最好的火花最佳实践提供有关查询的任何建议。

Jac*_*ski 6

SparkSqlParser

Spark SQL 使用SparkSqlParser ? 作为 Spark SQL 表达式的解析器。

您可以SparkSqlParser使用SparkSession(和SessionState)访问,如下所示:

val spark: SparkSession = ...
val parser = spark.sessionState.sqlParser

scala> parser.parseExpression("select * from table")
res1: org.apache.spark.sql.catalyst.expressions.Expression = ('select * 'from) AS table#0
Run Code Online (Sandbox Code Playgroud)

提示INFOorg.apache.spark.sql.execution.SparkSqlParserlogger启用日志级别以查看内部发生的情况。

SparkSession.sql 方法

仅凭这一点并不能为您提供抵御不正确 SQL 表达式的最强大的盾牌,并认为sql方法更合适。

sql(sqlText: String): DataFrame使用 Spark 执行 SQL 查询,将结果作为 DataFrame 返回。用于 SQL 解析的方言可以使用“spark.sql.dialect”进行配置。

请参阅下面的操作。

scala> parser.parseExpression("hello world")
res5: org.apache.spark.sql.catalyst.expressions.Expression = 'hello AS world#2

scala> spark.sql("hello world")
org.apache.spark.sql.catalyst.parser.ParseException:
mismatched input 'hello' expecting {'(', 'SELECT', 'FROM', 'ADD', 'DESC', 'WITH', 'VALUES', 'CREATE', 'TABLE', 'INSERT', 'DELETE', 'DESCRIBE', 'EXPLAIN', 'SHOW', 'USE', 'DROP', 'ALTER', 'MAP', 'SET', 'RESET', 'START', 'COMMIT', 'ROLLBACK', 'REDUCE', 'REFRESH', 'CLEAR', 'CACHE', 'UNCACHE', 'DFS', 'TRUNCATE', 'ANALYZE', 'LIST', 'REVOKE', 'GRANT', 'LOCK', 'UNLOCK', 'MSCK', 'EXPORT', 'IMPORT', 'LOAD'}(line 1, pos 0)

== SQL ==
hello world
^^^

  at org.apache.spark.sql.catalyst.parser.ParseException.withCommand(ParseDriver.scala:217)
  at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parse(ParseDriver.scala:114)
  at org.apache.spark.sql.execution.SparkSqlParser.parse(SparkSqlParser.scala:48)
  at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parsePlan(ParseDriver.scala:68)
  at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:638)
  ... 49 elided
Run Code Online (Sandbox Code Playgroud)