前言
一个 SQL 从词法解析, 语法解析, 逻辑执行计划, 物理执行计划最终转换为可以执行的 RDD, 中间经历了很多的步骤和流程. 其中词法分析和语法分析均有 ANTLR4 完成, 可以进一步学习 ANTLR4 的相关知识做进一步了解.
本篇文章主要对一个简单的 SQL 生成的逻辑执行计划物理执行计划的做一个简单地说明.
示例代码
- case class Person(name: String, age: Long)
- private def runBasicDataFrameExample2(spark: SparkSession): Unit = {
- import spark.implicits._
- val df: DataFrame = spark.sparkContext
- .parallelize(
- Array(
- Person("zhangsan", 10),
- Person("lisi", 20),
- Person("wangwu", 30))).toDF("name", "age")
- df.createOrReplaceTempView("people")
- spark.sql("select * from people where age>= 20").show()
- }
生成逻辑物理执行计划示例
生成的逻辑和物理执行计划, 右侧的是根据 QueryExecution 的 toString 方法, 得到的对应结果
QueryExecution 关键源码分析
对关键源码, 自己做了简单的分析. 如下图:
其中 SparkSqlParser 使用 ASTBuilder 生成 UnResolved LogicalPlan.
最后
注意 Spark SQL 从 driver 提交经过词法分析, 语法分析, 逻辑执行计划, 到可落地执行的物理执行计划. 其中前三部分都是 spark catalyst 子模块的功能, 与最终在哪个 SQL 执行引擎上执行并无多大关系. 物理执行计划是后续转换为 RDD 的基础和必要条件.
本文对 Spark SQL 中关键步骤都有一定的涉及, 也可以针对 QueryExecution 做后续的分析, 建议修改 SparkSQL 源码, 做本地调试. 后续会进一步分析, 主要结合 《SparkSQL 内核剖析》这本书以及自己在工作学习中遇到的各种问题, 做进一步源码分析
来源: https://www.cnblogs.com/johnny666888/p/12343338.html