测试 Spark SQL 语句的解析

Posted

技术标签:

【中文标题】测试 Spark SQL 语句的解析【英文标题】:Testing parsing of Spark SQL statements 【发布时间】:2020-11-30 23:52:34 【问题描述】:

我目前正在用 Scala (Scala 2.12.12) 编写 Spark 应用程序 (Spark 3.0.1),并希望对 sql 语句进行单元测试以检查它们是否可以正确解析。例如,我想检查一下:

SELECT a_column 
From a_table

正确解析,同时

SELECT a_column
a_table

应该失败

我尝试了以下方法:

val query =
  """SELECT
    | *
    | FROM a_table
    |  """.stripMargin

val parser = spark.sessionState.sqlParser
val queryParsingResult = Try(parser.parseExpression(query))

assert(queryParsingResult.isSuccess)

通过,但是当将查询更改为简单选择时:

val query =
  """SELECT
    | a_column
    | FROM a_table
    |  """.stripMargin

val parser = spark.sessionState.sqlParser
val queryParsingResult = Try(parser.parseExpression(query))

assert(queryParsingResult.isSuccess)

此测试失败,并出现“不匹配的输入 'FROM' 预期 ,'-'”异常。

我尝试了这种方法的几种不同变体,但似乎无济于事。 有没有办法将这些语句解析为单元测试的一部分?此外,对于更复杂的查询,我是否需要提供对 hivemeta 存储的访问权限,以便查询解析器能够理解表的底层数据架构?

【问题讨论】:

【参考方案1】:

我认为您正在寻找 parser.parsePlan 而不是 parser.parseExpression。第二个查询没有显示parsePlan 的错误。

但是,请注意

SELECT a_column
a_table

是一个有效的查询,相当于SELECT a_column AS a_table

【讨论】:

以上是关于测试 Spark SQL 语句的解析的主要内容,如果未能解决你的问题,请参考以下文章

spark sql解析过程中对tree的遍历(源码详解)

如何以编程方式检查(解析)SQL 语句的有效性?

Spark Thrift JDBCServer应用场景解析与实战案例

3. Spark SQL解析

Spark SQL:未解析的属性

Spark之SQL解析(源码阅读十)