作者:周志湖
下面的代码演示了通过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
例如:
整体流程图如下:
