spark sql 執行計劃生成案例
阿新 • • 發佈:2020-02-22
前言
一個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 核心剖析》這本書以及自己在工作學習中遇到的各種問題,做進一步原始碼