一、序言
可以说,RDD的使用是Spark最重要的抽象概念!
初学者可能不太理解这三者之间的关系,其实他们就是不断地抽象、封装,目的只有一个,Apache让Spark让你使用起来更简单!功能更强大!
二、三者的介绍
- RDD:传统MapReduce虽然也具有自动容错、负载均衡、可拓展等特点,但是是采用非循环的数据流模型结构,这使得在迭代时要与HDFS产生大量的IO,RDD正是解决了这个缺点的抽象模型,其实质就是Spark可以把RDD的结果缓存到内存中,避免重复计算和产生大量IO。
- 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提供了编译时类型的检查
三、三者相同功能
- 所有transformation操作的特点都是lazy的(惰性的),只有action操作才能触发执行。这就是函数式编程的好处,也是底层spark的优化:避免产生过多中间结果!
- 三者都会根据spark的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出(弹性的,内存不够使用磁盘)
四、三者的区别
- RDD不支持SparkSQLS操作
- dataSet 可以定义类型,可以定义类型,能对各种列进行各种精细操作,而dataFram 能注册成表。然后直接写sql语句就能操作了