一个SQL从词法解析、语法解析、逻辑执行计划、物理执行计划最终转换为能够执行的RDD,中间经历了不少的步骤和流程。其中词法分析和语法分析均有ANTLR4完成,能够进一步学习ANTLR4的相关知识作进一步了解。sql
本篇文章主要对一个简单的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 方法,获得的对应结果学习
对关键源码,本身作了简单的分析。以下图:ui
其中SparkSqlParser使用ASTBuilder生成UnResolved LogicalPlan。spa
注意Spark SQL 从driver 提交通过词法分析、语法分析、逻辑执行计划、到可落地执行的物理执行计划。其中前三部分都是 spark catalyst 子模块的功能,与最终在哪一个SQL执行引擎上执行并没有多大关系。物理执行计划是后续转换为RDD的基础和必要条件。3d
本文对Spark SQL中关键步骤都有必定的涉及,也能够针对QueryExecution作后续的分析,建议修改SparkSQL 源码,作本地调试。后续会进一步分析,主要结合 《SparkSQL 内核剖析》这本书以及本身在工做学习中遇到的各类问题,作进一步源码分析调试