作者:周志湖
下面的代碼示範了通過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
例如:
整體流程圖如下:
