- Spark SQL入门与数据分析实践
- 杨虹 谢显中 周前能 张安文编著
- 607字
- 2025-03-12 17:54:26
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的所有功能。