原文链接:https://blog.csdn.net/weixin_43087634/article/details/84398036
https://www.jianshu.com/p/8ab678331d95
https://www.cnblogs.com/lestatzhang/p/10611320.html
1.RDD
(1)RDD是一个懒执行的不可变的可以支持Lambda表达式的并行数据集合。
(2)RDD的最大好处就是简单,API的人性化程度很高。
(3)RDD的劣势是性能限制,它是一个JVM驻内存对象,这也就决定了存在GC的限制和数据增加时Java序列化成本的升高。
2.DataFrame
(1)DataFrame也是一个分布式数据容器,而且记录数据的结构信息,即schema,支持嵌套数据类型(struct、array和map)。
(2)DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低.
(3)Dataframe的劣势在于在编译期缺少类型安全检查,导致运行时出错
对比:
(1)RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象的集合。DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化,比如filter下推、裁剪等。
(2)性能上比RDD要高,主要有两方面原因:定制化内存管理(数据以二进制的方式存在于非堆内存,节省了大量空间之外,还摆脱了GC的限制);优化的执行计划(查询计划通过Spark catalyst optimiser进行优化)。
3.DataSet
(1)是Dataframe API的一个扩展,是Spark最新的数据抽象。
(2)用户友好的API风格,既具有类型安全检查也具有Dataframe的查询优化特性。
(3)Dataset支持编解码器,当需要访问非堆上的数据时可以避免反序列化整个对象,提高了效率。
样例类被用来在Dataset中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet中的字段名称。
Dataframe是Dataset的特列,DataFrame=Dataset[Row] ,所以可以通过as方法将Dataframe转换为Dataset。Row是一个类型,跟Car、Person这些的类型一样,所有的表结构信息我都用Row来表示。
DataSet是强类型的。比如可以有Dataset[Car],Dataset[Person].
三者的共性
(1)RDD、DataFrame、Dataset全都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利
(2)三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action如foreach时,三者才会开始遍历运算,极端情况下,如果代码里面有创建、转换,但是后面没有在Action中使用对应的结果,在执行时会被直接跳过.
(3)三者都会根据spark的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出。
(4)三者都有partition的概念,有许多共同的函数,如filter,排序等。
三者的区别
RDD:RDD一般和spark mlib同时使用;RDD不支持sparksql操作
DataFrame:DataFrame每一行的类型固定为Row,只有通过解析才能获取各个字段的值;DataFrame与Dataset均支持sparksql的操作,比如select,groupby之类,还能注册临时表/视窗,进行sql语句操作。
Dataset:Dataset和DataFrame拥有完全相同的成员函数,区别只是每一行的数据类型不同。DataFrame也可以叫Dataset[Row],每一行的类型是Row,不解析,每一行究竟有哪些字段,各个字段又是什么类型都无从得知,只能用上面提到的getAS方法或者共性中的第七条提到的模式匹配拿出特定字段。
rdd
优点
1.强大,内置很多函数操作,group,map,filter等,方便处理结构化或非结构化数据
2.面向对象编程,直接存储的java对象,类型转化也安全
缺点
1.由于它基本和hadoop一样万能的,因此没有针对特殊场景的优化,比如对于结构化数据处理相对于sql来比非常麻烦
2.默认采用的是java序列号方式,序列化结果比较大,而且数据存储在java堆内存中,导致gc比较频繁
dataframe
优点
1.结构化数据处理非常方便,支持Avro, CSV, elastic search, and Cassandra等kv数据,也支持HIVE tables, MySQL等传统数据表
2.有针对性的优化,由于数据结构元信息spark已经保存,序列化时不需要带上元信息,大大的减少了序列化大小,而且数据保存在堆外内存中,减少了gc次数。
3.hive兼容,支持hql,udf等.
缺点
1.编译时不能类型转化安全检查,运行时才能确定是否有问题
2.对于对象支持不友好,rdd内部数据直接以java对象存储,dataframe内存存储的是row对象而不能是自定义对象
dataset
优点
1.dataset整合了rdd和dataframe的优点,支持结构化和非结构化数据
2.和rdd一样,支持自定义对象存储
3.和dataframe一样,支持结构化数据的sql查询
4.采用堆外内存存储,gc友好
5.类型转化安全,代码友好
6.官方建议使用dataset
作者:Edison_Tu
链接:https://www.jianshu.com/p/8ab678331d95
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。