天天看點

Spark修煉之道(進階篇)——Spark源碼閱讀:第十二節 Spark SQL 處理流程分析

作者:周志湖

下面的代碼示範了通過case class進行表schema定義的例子:

(1)sql方法傳回dataframe

其中parsesql(sqltext)方法生成相應的logicalplan得到,該方法源碼如下:

ddlparser對象定義如下:

(2)然後調用dataframe的apply方法

可以看到,apply方法參數有兩個,分别是sqlcontext和logicalplan,調用的是dataframe的構造方法,具體源碼如下:

(3)val qe = sqlcontext.executeplan(logicalplan) 傳回queryexecution, sqlcontext.executeplan方法源碼如下:

queryexecution類中表達了spark執行sql的主要工作流程,具體如下

可以看到,sql的執行流程為

1.parsed logical plan:logicalplan

2.analyzed logical plan:

<code>lazy val analyzed: logicalplan = sqlcontext.analyzer.execute(logical)</code>

3.optimized logical plan:<code>lazy val optimizedplan: logicalplan = sqlcontext.optimizer.execute(withcacheddata)</code>

4. physical plan:<code>lazy val executedplan: sparkplan = sqlcontext.prepareforexecution.execute(sparkplan)</code>

可以調用results.queryexecution方法檢視,代碼如下:

(4) 然後調用dataframe的主構造器完成dataframe的構造

(5)

當調用dataframe的collect等方法時,便會觸發執行executedplan

例如:

整體流程圖如下:

Spark修煉之道(進階篇)——Spark源碼閱讀:第十二節 Spark SQL 處理流程分析

繼續閱讀