spark sql 執行計划生成案例


前言

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM