Spark中RDD,DataFrame,DataSet简单介绍

        Spark中三个主要的数据对象RDD, DataFrame和DataSet都是分布式弹性数据集,为我们处理大量数据提供了很方便的工具及其接口。下面我们对其简单介绍,并且介绍一下其中的联系。

        注:一下介绍的过程都是通过Java语言的视角介绍的。

RDD

        RDD是一个分布式的对象集合,本质上是一个不可修改的只读的对象集合。在java中我们申请RDD对象,声明的类型是JavaRDD,所以说其基本单位是一个对象,不同的Work节点上分布着不同的对象,如图1所示:

 

                                    Spark中RDD,DataFrame,DataSet简单介绍_第1张图片

                                                            图1

        对于每个RDD对象,我们是不能修改的,我们只能对他进行遍历,然后返回一个新的其他类型的值,例如返回一个新的RDD对象。例如map算子,就是通过遍历远RDD然后生成一个新的RDD对象。我们也不能像其他对象一样通过set方法对其重新负值什么的。所以RDD有以下特性:

        只读:不能修改,只能通过一些算子转换生成新的RDD;

        分布式:一个RDD对象中的所有对象是分布在所有节点上的,是可以并行处理的;

        除此之外还有其他的特点。

        基于内存:RDD对象是缓存在内存中的,所以这个特点是spark比mapreduce快的一个重要因素;

        弹性:我们知道Spark是基于内存计算的,但是这个弹性特点,就是当内存放不下的时候,可以放到磁盘上。

        RDD的基本粒度是对象,所以注定了,其对对象中的数据细节是不知道的,对于对象的处理也不够灵活。

DataFrame

        DataFrame感觉可以说是为了弥补RDD带来的不足而产生的。它将数据组织为类似的关系型数据库中表的形式(行列形式),并且是带约束的,明确每列的数据类型。如下图所示:

                                                         Spark中RDD,DataFrame,DataSet简单介绍_第2张图片

 

        它的每一行是Row的形式,相对于RDD来说,它对数据的细节就更加清楚,也是由于他的结构的问题,就可以对数据进行更加复杂和直观的操作。并且他还可以通过registerTempTable(tableName)的形式将其注册为一张临时表,再结合SparkSql,这就大大的方便了开发人员通过熟悉的Sql语句的形式对统一集合和不同集合的数据进行方便的操作。

DataSet

        DataSet是spark1.6才出现的,他的基本形式是DataSet,而DataFrame就可以看成一个特殊的DataSet,即DataSet,他可以完成DataFrame的所有功能,所以这也是为什么Spark2之后就没有了DataFrame了,就完全被DataSet代替了。

        DataSet的创建需要传入一个显示的Encoder,把对象序列化为二进制,可以把对象的scheme映射为SparkSQL类型如图所示

 

        所以DataSet可以直接在对象上使用SparkSql操作。

        它也可以有效地处理结构化和非结构化数据。 它表示行(row)JVM对象或行对象集合形式的数据。 它通过编码器以表格形式(tabular forms)表示。

        DataSet为什么替代DataFrame?因为DataSet不仅可以完成DataFrame的所有功能外,还因为在DataFrame中如果尝试访问表中不存在的列,则持编译错误, 它仅在运行时检测属性错误;而DataSet可以在编译时检查类型, 它提供编译时类型安全性,这就方便了程序员提前发现错误,调高了效率。

        三者还在序列化上有很大的不同。RDD中每当Spark需要在集群内分发数据或将数据写入磁盘时,它就会使用Java序列化。序列化单个Java对象的开销很昂贵,并且需要在节点之间发送数据和结构,所以效率相对较低。DataFrame可以将数据序列化为二进制格式的堆外存储(在内存中),然后直接在此堆内存上执行许多转换。无需使用java序列化来编码数据。DataSet中在序列化数据时,Spark中的数据集API具有编码器的概念,该编码器处理JVM对象与表格表示之间的转换。它使用spark内部Tungsten二进制格式存储表格表示,数据集允许对序列化数据执行操作并改善内存使用,它允许按需访问单个属性,而不会消灭整个对象,也就不需要反序列化生个对象。

        所以DataSet不仅在功能上可以更加方便的处理数据,也在底层的存储和序列化上做了优化,使其效率更高了。

你可能感兴趣的:(Spark,Spark)