1.SparkSql是什么?

1. SparkSql 是Spark生态体系中的一个基于SparkCore的SQL处理模块

2. 用途是处理具有结构化的数据文件的

3. 前身叫Shark,由于Shark是基于Hive,而Hive的发展限制了Shark的功能更新,因此该项目的负责人停止项目的发展,将相应的SQl处理功能独立出来,更名为SparkSQL

4. SparkSQL也是基于内存和RDD的

5. 本质是SparkSQL会在底层转成sparkcore程序

2.SparkSQL的特点

1.无缝整合:无缝的整合了SQL查询和Spark编程,可以使用熟悉的sql在spark中查询结构化数据

2.统一的数据访问接口:可以使用统一的访问接口来访问不同的数据源,如mysql,hive,jdbc等

3.hive集成:可以使用sparksql直接访问hive的数据

4.提供了标准的jdbc和odbc连接接口:可以像其他语言一样,使用jdbc或者odbc连接RDBMS等

3.1SparkSQL的数据模型

RDD:RDD是弹性分布式数据集,是一个不存储数据的,不可变,可分区的,并行计算的数据集合

DataFrame:RDD是一个弹性分布式数据集,DataFrame在RDD的基础上加了Schema的概念,这里的Schema就是表头。 扩展:Schema表示描述数据的数据,即可以认为是元数据, DataFrame曾经就有个名字叫SchemaRDD

DataSet:DataSet 也是一种弹性分布式数据集,在RDD的基础上提供了强制类型检测和转换的功能

3.2三者的共性

1、RDD、DataFrame、Dataset全都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利

2、三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action如foreach时,三者才会开始遍历运算,极端情况下,如果代码里面有创建、转换,但是后面没有在Action中使用对应的结果,在执行时会被直接跳过。

3.3三者的区别

RDD:

1.RDD一般和spark mlib 同时使用

2.RDD不支持sparksql操作

DataFrame:

1.与RDD和Data不同,DataFrame每一行的类型固定为Row,只有通过解析才能获取各个字段的值

2、DataFrame与Dataset一般不与spark ml同时使用

3、DataFrame与Dataset均支持sparksql的操作,比如select,groupby之类,还能注册临时表/视窗,进行sql语句操作

4、DataFrame与Dataset支持一些特别方便的保存方式,比如保存成csv,可以带上表头,这样每一列的字段名一目了然,利用这样的保存方式,可以方便的获得字段名和列的对应,而且分隔符(delimiter)可以自由指定。

Dataset:

Dataset和DataFrame拥有完全相同的成员函数,区别只是每一行的数据类型不同。

DataFrame也可以叫Dataset[Row],每一行的类型是Row,不解析,每一行究竟有哪些字段,各个字段又是什么类型都无从得知,只能用上面提到的getAS方法或者共性中的第七条提到的模式匹配拿出特定字段

而Dataset中,每一行是什么类型是不一定的,在自定义了case class之后可以很自由的获得每一行的信息