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之后可以很自由的获得每一行的信息