RDD、DataFrame、DataSet的关系是抽象关系

一、序言
可以说,RDD的使用是Spark最重要的抽象概念!
初学者可能不太理解这三者之间的关系,其实他们就是不断地抽象、封装,目的只有一个,Apache让Spark让你使用起来更简单!功能更强大!

二、三者的介绍

  1. RDD:传统MapReduce虽然也具有自动容错、负载均衡、可拓展等特点,但是是采用非循环的数据流模型结构,这使得在迭代时要与HDFS产生大量的IO,RDD正是解决了这个缺点的抽象模型,其实质就是Spark可以把RDD的结果缓存到内存中,避免重复计算和产生大量IO。
  2. DataFrame:是RDD的封装,作为增强,DF还引入了off-heap机制,意味着JVM堆以外的内存直接受操作系统管理,避免数据量过大时频繁的gc操作,此外DF还提供了更丰富的算子;我们还可以将DF看作是一个关系型数据表,然后可以通过在程序中使用spark.sql() 来执行SQL语句查询,结果返回一个DataFrame还可以通过DF API或SQL处理数据会进过Spark优化器(catalyst)自动优化SQL,妈妈再也不担心我写的SQL烂了!
    但是,DF失去了RDD的强类型特性,这导致如果类型有错,程序编译打包都不会报错
对于分布式程序来讲,提交一次作业太费劲了(要编译、打包、上传、运行),到提交到
集群运行时才发现错误,这会浪费大量的时间,这也是引入Dataset的一个重要原因。

3、DataSet:saprk2.0之后DataSet和DataFrame进行了统一,DF表示为DataSet[Row],也就是说DF成了DS的子集,相比DF,DS提供了编译时类型的检查

三、三者相同功能

  1. 所有transformation操作的特点都是lazy的(惰性的),只有action操作才能触发执行。这就是函数式编程的好处,也是底层spark的优化:避免产生过多中间结果!
  2. 三者都会根据spark的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出(弹性的,内存不够使用磁盘)

四、三者的区别

  1. RDD不支持SparkSQLS操作
  2. dataSet 可以定义类型,可以定义类型,能对各种列进行各种精细操作,而dataFram 能注册成表。然后直接写sql语句就能操作了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值