10.5 RDD
, DataFrame
和 DataSet
之间的关系
在 SparkSQL 中 Spark 为我们提供了两个新的抽象,分别是DataFrame
和DataSet
。他们和RDD有什么区别呢?首先从版本的产生上来看:
RDD (Spark1.0) —> Dataframe(Spark1.3) —> Dataset(Spark1.6)
如果同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果。
在后期的 Spark 版本中,DataSet
会逐步取代RDD
和DataFrame
成为唯一的 API 接口。
10.5.1 三者的共性
RDD
、DataFrame
、Dataset
全都是 Spark 平台下的分布式弹性数据集,为处理超大型数据提供便利三者都有惰性机制,在进行创建、转换,如
map
方法时,不会立即执行,只有在遇到Action
如foreach
时,三者才会开始遍历运算。三者都会根据 Spark 的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出
三者都有
partition
的概念三者有许多共同的函数,如
map, filter
,排序等在对
DataFrame
和Dataset
进行操作许多操作都需要这个包进行支持import spark.implicits._
DataFrame
和Dataset
均可使用模式匹配获取各个字段的值和类型
10.5.2 三者的区别
1.RDD
RDD
一般和spark mlib
同时使用RDD
不支持sparksql
操作
2. DataFrame
与
RDD
和Dataset
不同,DataFrame
每一行的类型固定为Row
,每一列的值没法直接访问,只有通过解析才能获取各个字段的值,DataFrame
与DataSet
一般不与 spark mlib 同时使用DataFrame
与DataSet
均支持 SparkSQL 的操作,比如select,groupby
之类,还能注册临时表/视窗,进行 sql 语句操作DataFrame
与DataSet
支持一些特别方便的保存方式,比如保存成csv
,可以带上表头,这样每一列的字段名一目了然(后面专门讲解)
3. DataSet
Dataset
和DataFrame
拥有完全相同的成员函数,区别只是每一行的数据类型不同。DataFrame
其实就是DataSet
的一个特例DataFrame
也可以叫Dataset[Row]
,每一行的类型是Row
,不解析,每一行究竟有哪些字段,各个字段又是什么类型都无从得知,只能用上面提到的getAS
方法或者共性中的第七条提到的模式匹配拿出特定字段。而Dataset
中,每一行是什么类型是不一定的,在自定义了case class
之后可以很自由的获得每一行的信息