【大数据】Spark SQL的相关总结【重点笔记!!!】

1. Spark SQL的介绍

Spark SQL是Spark处理数据的一个模块,跟基本的Spark RDD的API不同,Spark SQL中提供的接口将会提供给Spark更多关于结构化数据和计算的信息。其本质是,Spark SQL使用这些额外的信息去执行额外的优化。
Shark是Spark SQL的前身,是一种分布式SQL查询工具,它的设计目标就是兼容Hive。

Hive、Shark体系结构图:

【大数据】Spark SQL的相关总结【重点笔记!!!】
(1)数据兼容
在兼容Hive的同时,还可以从RDD、Parquet文件、JSON文件中获取数据,后续的版本甚至支持获取RDBMS数据以及Cassandra等NoSQL数据。
(2)性能优化
除了采取多种优化技术,如In-Memory Columnar Storage、byte-code generation等,后续将会引进Cost Model对查询进行动态评估、获取最佳物理计划等。
(3)组件扩展
重新定义了SQL的语法解析器、分析器、优化器,方便进行扩展。

2. Spark SQL的执行原理

近似于关系型数据库,Spark SQL语句由Projection(a1,a2,a3)、Data Source(tableA)、Filter(condition)组成,分别对应SQL查询过程中的Result、Data Source、Operation,也就是说,SQL语句是按指定次序来描述的,如Result→Data Source→Operation,

Spark SQL创建次序图:

【大数据】Spark SQL的相关总结【重点笔记!!!】
执行Spark SQL语句的顺序如下:
(1)对读入的SQL语句进行解析(Parse),分辨出SQL语句中的关键词(如SELECT、FROM、Where)、表达式、Projection、Data Source等,从而判断SQL语句是否规范。
(2)将SQL语句和数据库的数据字典(列、表、视图等)进行绑定(Bind),如果相关的Projection、Data Source等都存在的话,就表示这个SQL语句是可以执行的。
(3)选择最优计划。一般的数据库会提供几个执行计划,这些计划一般都有运行统计数据,数据库会在这些计划中选择一个最优计划(Optimize)。
(4)计划执行(Execute)。计划执行按Operation→Data Source→Result的次序来进行,在执行过程中有时候甚至不需要读取物理表就可以返回结果,如重新运行执行过的SQL语句,可直接从数据库的缓冲池中获取返回结果。

3. Spark SQL的创建

Spark SQL是由DataFrame派生出来的,在使用时,第一步先创建DataFrame,第二步将DataFrame注册成临时表,第三步使用临时表进行查询统计。为了让大家更容易理解Spark SQL的使用,接下来讲解Spark SQL与DataFrame的创建过程。
(1)读取文本文件并查看数据的数目
【大数据】Spark SQL的相关总结【重点笔记!!!】
(2)查看前5项数据
【大数据】Spark SQL的相关总结【重点笔记!!!】
(3)按照“,”符号获取每一个字段。
从之前的步骤看出,因为字段之间以“,”符号分隔,所以使用下列程序来获取每一个字段。以下程序代码RawSalesDataRDD.map(lambda line:…)使用map处理每一项数据,用lambda语句创建匿名函数传入line参数。在匿名函数中,line.split(“,”)按照“,”符号获取一个字段。最后查看前5项数据
【大数据】Spark SQL的相关总结【重点笔记!!!】
(4)使用RDD创建DataFrame
上面创建了RawSalesDataRDD,因此使用RDD创建DataFrame,首先构造sqlContext
【大数据】Spark SQL的相关总结【重点笔记!!!】
定义Schema,定义DataFrame的每一个字段名与数据类型,
【大数据】Spark SQL的相关总结【重点笔记!!!】
创建了sale_Rows之后,使用sqlContext.createDataFrame()方法传入sale_Rows数据,创建DataFrame,然后使用.printSchema()方法查看DataFrame的Schema,
【大数据】Spark SQL的相关总结【重点笔记!!!】
以上结果显示的是Schema,可以看到所有的数据成员都是string类型,下面是查看DataFrame数据。
【大数据】Spark SQL的相关总结【重点笔记!!!】
(5)使用Spark SQL
在上一步创建了DataFrame类型的sale_df后,需要使用registerTempTable方法将DataFrame注册成一张临时表,注册后就可以使用Spark SQL。其中registerTempTable函数需要传递一个参数,如图所示,sale_table就是临时表的表名,在接下来的操作中可以使用该表名进行查询统计。
【大数据】Spark SQL的相关总结【重点笔记!!!】
使用Spark SQL 查看项数
【大数据】Spark SQL的相关总结【重点笔记!!!】
使用Spark SQL查看数据,
【大数据】Spark SQL的相关总结【重点笔记!!!】