spark学习(1)——RDD和DataFrame和DataSet三者间的区别

原文链接: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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值