天天看点

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 处理流程分析

继续阅读