Spark SQL的哪一部分解析SQL语句并创建执行计划?

Dav*_*d H 2 apache-spark apache-spark-sql

假设以下查询:

select * from my_table
Run Code Online (Sandbox Code Playgroud)

Spark的哪一部分解析sql并创建执行计划?

Spark SQL执行引擎是否有自己的sql解析器将其转换为自己的执行模型?这个怎么运作?

我得到一些异常,因为某些函数还没有支持它们,它是否意味着火花解析sql查询?彼此的执行引擎也做了吗?

Jac*_*ski 12

在Spark SQL中,AstBuilder构建逻辑运算符和表达式的抽象语法树.

AstBuilder将ANTLR4 ParseTree转换为催化剂Expression,LogicalPlanTableIdentifier.

AstBuilder是一个基于ANTLR的SQL解析器,它使用SqlBase.g4中描述的SQL语法(偶然借用了Facebook的Presto,并附加了对Hive和PostgreSQL语句的支持).

您可以使用SparkSession.sql来播放支持的查询:

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

您可以进入低级别并直接使用解析器:

import spark.sessionState.sqlParser
scala> :type sqlParser
org.apache.spark.sql.catalyst.parser.ParserInterface
Run Code Online (Sandbox Code Playgroud)

使用parsePlan接受SQL文本的方法(在其他解析方法中).

scala> sqlParser.parsePlan("select * from myTable")
res1: org.apache.spark.sql.catalyst.plans.logical.LogicalPlan =
'Project [*]
+- 'UnresolvedRelation `myTable`
Run Code Online (Sandbox Code Playgroud)

使用逻辑计划(对于SQL),Spark SQL使用我称之为结构化查询执行管道(即QueryExecution)的东西:

QueryExecution使用Spark执行关系查询的主要工作流程.旨在允许开发人员轻松访问查询执行的中间阶段.

每个Dataset都有自己的QueryExecution,你可以使用queryExecution属性访问:

val q = spark.range(5)
val qe = q.queryExecution
Run Code Online (Sandbox Code Playgroud)

您可以访问使用查询执行的阶段analyzed,withCachedData,optimizedPlan,sparkPlan,executedPlan,toRdd懒值是一起利用显示的explain运营商.

scala> q.explain(extended = true)
== Parsed Logical Plan ==
Range (0, 5, step=1, splits=Some(8))

== Analyzed Logical Plan ==
id: bigint
Range (0, 5, step=1, splits=Some(8))

== Optimized Logical Plan ==
Range (0, 5, step=1, splits=Some(8))

== Physical Plan ==
*Range (0, 5, step=1, splits=8)
Run Code Online (Sandbox Code Playgroud)

  • 对 Impala 和 Tez 一无所知。对不起。我不会把宝贵的时间花在过时的事情上;-) (2认同)