Spark中RDD的理解,以及RDD与DataFormat、DataSet间的关系

## 三者转换关系

在这里插入图片描述

什么是RDD

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象。
在代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。RDD支持两种类型的操作,转化操作(transform)和行动操作(action)。

一个 RDD 可以简单的理解为一个分布式的元素集合.
RDD 表示只读的分区的数据集,对 RDD 进行改动,只能通过 RDD 的转换操作, 然后得到新的 RDD, 并不会对原 RDD 有任何的影响
在 Spark 中, 所有的工作要么是创建 RDD, 要么是转换已经存在 RDD 成为新的 RDD, 要么在 RDD 上去执行一些操作来得到一些计算结果.
每个 RDD 被切分成多个分区(partition), 每个分区可能会在集群中不同的节点上进行计算.

什么是 DataFrame

与 RDD 类似,DataFrame 也是一个分布式数据容器。
然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema。
同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。
从 API 易用性的角度上看,DataFrame API提供的是一套高层的关系操作,比函数式的 RDD API 要更加友好,门槛更低。

在这里插入图片描述
DataFrame也是懒执行的
性能上比 RDD要高,主要原因: 优化的执行计划:查询计划通过Spark catalyst optimiser进行优化。比如下面一个例子:

什么是 DataSet

1.是DataFrame API的一个扩展,是 SparkSQL 最新的数据抽象(1.6新增)。
2.用户友好的API风格,既具有类型安全检查也具有DataFrame的查询优化特性。
3.Dataset支持编解码器,当需要访问非堆上的数据时可以避免反序列化整个对象,提高了效率。
4.样例类被用来在DataSet中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet中的字段名称。
5.DataFrame是DataSet的特列,DataFrame=DataSet[Row] ,所以可以通过as方法将DataFrame转换为DataSet。Row是一个类型,跟Car、Person这些的类型一样,所有的表结构信息都用Row来表示。
6.DataSet是强类型的。比如可以有DataSet[Car],DataSet[Person].
7.DataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的,比如你可以对一个String进行减法操作,在执行的时候才报错,而DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查。就跟JSON对象和类对象之间的类比。

发布了5 篇原创文章 · 获赞 0 · 访问量 18

猜你喜欢

转载自blog.csdn.net/DaDiNiWangGe/article/details/104426473