1.4.2 Spark SQL的运行原理

前面讲解了传统SQL语句运行的流程及原理。在Spark SQL中,则是通过SQLContext或HiveContext来对SQL语句进行解析的。

对于SQLContext和HiveContext,它们与1.4.1小节讲到的SQL语句的运行原理在本质上是类似的,都使用了相同的逻辑过程。本小节将分别为读者介绍SQLContext和HiveContext的执行过程。

1.SQLContext的执行过程

SQLContext的执行过程如图1-4所示。

图1-2 SQLContext的执行过程

该过程主要分为以下几个步骤。

① 使用SQLParse(SQL解析器)将SQLText(SQL语句)解析成Unresolved Logical Plan(未处理逻辑计划)。

② 使用Analyzer(分析器)将Unresolved Logical Plan与数据字典进行绑定,生成Resolved Logical Plan(已处理逻辑计划)。

③ 使用Optimizer(优化器)对Resolved Logical Plan进行优化,生成Optimized Logical Plan(优化的逻辑计划)。

④ 使用SparkPlan将Optimized Logical Plan转换成Physical Plan(物理计划)。

⑤ 使用prepareForexecute函数将Physical Plan转换成可执行的Physical Plan。

⑥ 使用execute函数执行Physical Plan。

⑦ 将运行后的数据封装为SchemaRDD。

2.HiveContext的执行过程

HiveContext处理数据的执行过程如图1-5所示。该过程主要分为以下几个步骤。

图1-2 HiveContext的执行过程

① 使用HiveQL.parseSql函数将SQLText解析成Unresolved Logical Plan。

② 使用Analyzer将Unresolved Logical Plan与Hive元数据Metastore进行绑定,生成Resolved Logical Plan。

③ 使用Optimizer对Resolved Logical Plan进行优化,生成Optimized Logical Plan。优化前使用以下语句进行预处理。


ExtractPythonUdfs(catalog.PreInsertionCasts(catalog.CreateTables(analyzed)))

④ 使用HivePlanner将Optimized Logical Plan转换成Physical Plan。

⑤ 使用prepareForexecute函数将Physical Plan转换成可执行的Physical Plan。

⑥ 使用execute函数执行Physical Plan。

⑦ 运行后,使用map(_.copy)函数将结果导入SchemaRDD。

在SQL语句执行时,需要经过解析、绑定、优化等过程,然后把逻辑计划转换为物理计划,最后封装成DataFrame模型。

从Spark SQL 2.0开始,Spark SQL使用全新的SparkSession接口替代Spark SQL 1.6中的SQLContext和HiveContext来实现对数据的加载、转换和处理等。它能够实现SQLContext和HiveContext的所有功能。