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