1. 程式人生 > >spark sql 執行計劃生成案例

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