spark中RDD,DataSet,DataFrame的区别

接触到spark不可避免的会接触spark的Api;

          rdd,DataFrame,DataSet,

接下来就大致说一下他们的有点以及各自的区别;

首先DataFrame,DataSet是基于RDD之上的,而且可以通过简单的api调用进行无缝切换。

RDD的优点;

1;相对比与传统的MapReduce框架,spark的RDD中内置了很多函数操作,map,flatMap,filter等算子,方便处理结构化和非结构化的数据。

2;面向对象编程,直接存储java对象,类型转化也很安全。

RDD的缺点;

1;存在大量的序列化和反序列化的性能开销,因为无论是集群间通信还是IO操作都是需要进行序列化和反序列化的。

2;并没有对特殊场景进行优化,比如对于结构化数据,以及sql的操作就很乏力。

3;GC性能的开销,基于内存计算,频繁的创建和销毁对象,势必会增加GC。

接下来说DataFrame

优点;

1;DataFrame是sparkSql的APi,在RDD的基础之上又引入了schema和off-heap;

schema;RDD中的每一行的数据,结构都是一样的,这个结构就存储在schema中,spark通过schema就可以读懂数据,因此在通信和IO的过程中只需要进行序列化和反序列化,而结构的部分就可以省略了。

off-heap;意味着开始使用堆外内存,这些内存直接受操作系统管理,而不是由jvm管理,spark能够以二进制的形式序列化数据,此处不包含结构,要操作数据的时候只需要直接操作off-heap内存即可,由于spark理解schema,所以知道怎么去操作,而且将数据保存在堆外,减少了gc次数,所以运行更快。

通过schema和off-heap, DataFrame解决了RDD的缺点, 但是却丢了RDD的优点. DataFrame不是类型安全的, API也不是面向对象风格的.

2;结构化数据的处理非常方便,支持json,parquent等kv数据,也支持hive,mysql等传统数据库

3;对hive的兼容,支持hsql,udf,udaf等

缺点;

1;在编译时不能做类型转换的安全检查,只有在运行期在能确定是否存在问题

2;对于对象支持不友好,RDD内部数据直接以java对象方式存储,而DataFrame内存存储的是row对象,而不是自定义对象。

最后是DataSet;

优点;

1;DataSet整合了dataFrame,RDD的优点,支持结构化和非结构化的数据

2;和RDD一样,支持自定义对象存储

3;和DataFrame一样,支持结构化数据的sql查询

4,采用堆外内存,gc友好

5;类型转化安全,代码友好。

6;一个新的概念Encoder;

  当序列化数据的时候Encoder会产生字节码与off-heap进行交互,能够达到按需访问数据的效果,而不需要反序列化整个对象

最后一个;如何选择RDD,还是DataFrame/DataSet呢?

RDD提供低级别的功能和更多的控制,

而DataFrame和DataSet允许自定义视图和结构,提供高级和特定领域的操作,节省空间,并能够以极高的速度执行

猜你喜欢

转载自blog.csdn.net/Galaxy_songypd/article/details/84582321