Spark中的RDD,DataFrame和DataSet

RDD
RDD是一个懒执行不可变支持函数式编程并行数据集合,RDD的最大好处就是简单,提供大量可操作API,但RDD的劣势是性能,它是JVM的常驻内存对象,这里就需要使用GC来进行数据的管理还有对基础数据类型进行序列化

DataFrame
DataFrame其实就相当于RDD+schema信息的集合
schema是什么?
在数据库中schema是数据库的组织和结构模式
一个schema对象可以包含 表,列,数据类型,视图,存储过程,关系,主键,外键等…
就相当于一个表
DataFrame也是一个分布式的数据容器,也是懒执行,性能比RDD要高原因是:

1:定制化内存
RDD所有的数据都是存储在堆内存中,并且是使用GC来进行管理的,DataFrame的数据是存在在堆外内存中,不是使用GC来进行管理的数据是以二进制形式存储在堆外内存,节省空间摆脱GC的控制

2:RDD将数据存在堆内内存中,就需要使用GC来管理,那么就有可能会出现资源不一致的问题,
原因是Spark不是直接管理内存的,管理者是GC,就有可能会出现这段空间已经被回收 ,等Spark显示的时候这段空间的数据还能展现出来一部分,所以Spark显示内存信息的时候可能无法精确显示(最常出现的一个问题就是内存溢出)

DataFrame的劣势在于缺少编译时期类型安全检查,可能会导致运行时出错
ps:DataFreme只是知道字段,但是不知道字段的类型,所以在执行操作的时候没有编发在编译时期检查类型为了解决这个问题Spark提供了一个加强类型 DataSet
DataSet
是DataFrameAPI的一个扩展,算是Spark最新的数据抽象
它具备所有DataFrame操作方式并且提供严格的安全检查机制,不仅知道字段而且知道字段的数据类型

DataSet还支持解码器,当需要访问非堆上的数据是可以避免反序列化整个对象,提供高效率DataFrame是DataSet的特列 DataFrame 等于 DataSet[Row]

ps:Row是一个类型,就好比自定义的类Car,Person,
所表示的表的结构 即Row会用来保存表结构信息的
DataSet[Row]
例如: DataFrame存储了Car的信息 等价的转化为DataSet[Car](就相当于java里面的泛型)
三者之间的共性:
1:全都是Spark平台下的分布式弹性数据集,用来处理超大的数据
2、三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action如
foreach时,三者才会开始遍历运算,极端情况下,如果代码里面有创建、转换,但是后面没有在
Action中使用对应的结果,在执行时会被直接跳过. 3、三者都会根据spark的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出
4、三者都有partition的概念
5、三者有许多共同的函数,如filter,排序等
6、DataFrame和Dataset均可使用模式匹配获取各个字段的值和类型
三者的区别
RDD
1、RDD一般和spark mlib同时使用
2、RDD不支持sparksql操作
DataFrame
1、与RDD不同,DataFrame每一行的类型固定为Row,只有通过解析才能获取各个字段的
值每一列的值没法直接访问
2、DataFrame与Dataset一般不与spark mlib同时使用

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

Dataset
Dataset和DataFrame拥有完全相同的成员函数,区别只是每一行的数据类型不同。
DataFrame也可以叫Dataset[Row],每一行的类型是Row,不解析,每一行究竟有哪些字段,各个字段
又是什么类型都无从得知,只能用上面提到的getAS方法或者共性中的模式匹配拿出特定
字段
而Dataset中,每一行是什么类型是不一定的,在自定义了case class之后可以很自由的获得每一行的信息

Dataset在需要访问列中的某个字段时是非常方便的,然而,如果要写一些适配性很强的函数时,
如果使用Dataset,行的类型又不确定,可能是各种case class,无法实现适配,这时候用DataFrame即
Dataset[Row]就能比较好的解决问题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值