前言
一個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 內核剖析》這本書以及自己在工作學習中遇到的各種問題,做進一步源碼分析
