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,LogicalPlan或TableIdentifier.
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)
| 归档时间: |
|
| 查看次数: |
2287 次 |
| 最近记录: |