SparkSQL(一)——概述

什么是sparksql

它是RDD与sql语句的结构体。RDD在底层提供了分布式的数据访问接口,而sql语句在上层提供了编写程序的方式。它兼具了RDD访问速度快、访问数据量大和sql语句易于开发的双重特点,专门用于访问结构化的数据sql语句在底层转换成RDD,类似于hql语句在底层转换成mr程序,但是sparksql的访问速度快于hive。

   

DataFrame

与RDD类似,DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema。同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。从API易用性的角度上看,DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低。

SparkSQL(一)——概述

 

 上图直观地体现了DataFrame和RDD的区别。左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。

 

DataFrame是为数据提供了Schema的视图。可以把它当做数据库中的一张表来对待,DataFrame也是懒执行(触发执行)的。性能上比RDD要高,主要原因:

优化的执行计划:查询计划通过Spark catalyst optimiser进行优化。

SparkSQL(一)——概述

 

(第三张图做出的优化在于边扫描边过滤) 

为了说明查询优化,我们来看上图展示的人口数据分析的示例。图中构造了两个DataFrame,将它们join之后又做了一次filter操作。如果原封不动地执行这个执行计划,最终的执行效率是不高的。因为join是一个代价较大的操作,也可能会产生一个较大的数据集。如果我们能将filter下推到 join下方,先对DataFrame进行过滤,再join过滤后的较小的结果集,便可以有效缩短执行时间。而Spark SQL的查询优化器正是这样做的。简而言之,逻辑查询计划优化就是一个利用基于关系代数的等价变换,将高成本的操作替换为低成本操作的过程

 

DataSet

相比于dataframe,dataset做出的改进在于:将dataframe中的结构化数据加入了面向对象的特性,dataframe中的数据是一张表,dataset中的数据一群对象的集合。可以以面向对象的方式操纵dataset。

1)是Dataframe API的一个扩展,是Spark最新的数据抽象。

2)用户友好的API风格,既具有类型安全检查也具有Dataframe的查询优化特性。

3)Dataset支持编解码器,当需要访问非堆上的数据时可以避免反序列化整个对象,提高了效率。(???)

4)样例类被用来在Dataset中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet中的字段名称(可以理解为Java中的bean对象

5) DataframeDataset的特列,DataFrame=Dataset[Row] ,所以可以通过as方法将Dataframe转换为DatasetRow是一个类型,跟CarPerson这些的类型一样,所有的表结构信息我都用Row来表示。

6)DataSet是强类型的。比如可以有Dataset[Car],Dataset[Person].

7)DataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的,比如你可以对一个String进行减法操作,在执行的时候才报错,而DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查。就跟JSON对象和类对象之间的类比。

上一篇:SparkSQL 核心编程


下一篇:Spark08-SparkSQL之DataFrame