RDD、DataFrame、Dataset

首先从版本的产生上来看:
RDD (Spark1.0) —> Dataframe(Spark1.3) —> Dataset(Spark1.6)

 

RDD

     RDD的劣势是性能限制,它是一个JVM驻内存对象,这也就决定了存在GC的限制和数据增加时Java序列化成本的升高。

 

Dataframe

     与RDD类似,DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema

RDD、DataFrame、Dataset

上图直观地体现了DataFrame和RDD的区别。左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称是什么。DataFrame多了数据的结构信息,即schema。RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象的集合。DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化,比如filter下推、裁剪等。

DataFrame是为数据提供了Schema的视图。可以把它当做数据库中的一张表来对待

DataFrame也是懒执行的。

性能上比RDD要高,主要有两方面原因:

1)定制化内存管理
     数据以二进制的方式存在于非堆内存,节省了大量空间之外,还摆脱了GC的限制。

2)优化的执行计划
     查询计划通过Spark catalyst optimiser进行优化.

Dataframe的劣势在于在编译期缺少类型安全检查,导致运行时出错。

 

Dataset

  1. 具有类型安全检查也具有Dataframe的查询优化特性。
  2. DataFrame只是知道字段,但是不知道字段的类型。

 

三者的区别

1、RDD一般和spark mlib同时使用

2、RDD不支持 sparksql 操作

3、DataFrame与Dataset均支持 sparksql 操作