理解 RDD、DataFrame、DataSet、DStream

一、什么是RDD?

RDD叫做弹性分布式数据集,是spark中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性、不可变、可分区、里面元素可并行计算的集合。

1.弹性:

(1)存储的弹性:内存与磁盘的自动切换

(2)容错的弹性:数据丢失可以自动恢复

(3)计算的弹性:计算出错重试机制

(4)分片的弹性:可根据需要重新分片

2.分布式:存储在大数据集群不同节点上

3.数据集:RDD封装了计算逻辑,并不保存数据

4.数据抽象:RDD是一个抽象类,需要子类具体实现

5.不可变:RDD封装了计算逻辑,是不可以改变的,想要改变,只能产生新的RDD,在新的RDD里面封装计算逻辑

6.可分区、可并行计算

 

二、DataFrame是什么

在spark中,DataFrame是一种一RDD为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame与RDD的主要区别在于,DataFrame带有schema元信息,即其所表示的二维表数据集的每一列都带有名称与类型。这使得SparkSQL得以洞察更多的结构信息,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。反观RDD,由于无从得知所在所存数据元素的具体内部结构,Spark Core只能在stage层面进行简单、通用的流水线优化。

同时,与HIVE类似,DataFrame也支持嵌套数据类型(struct、array、map),从API易用性角度上看,DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低。

 

上图直观的体现了DataFrame与RDD的区别。

左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚的知道该数据集中包含哪些列,每列的名称和类型各是什么。

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

DataFrame也是懒执行的,但性能上比RDD要高,主要原因:优化执行计划,即查询计划通过 Spark catalyst optimiser 进行优化。

三、DataSet是什么?

DataSet是分布式数据集合。是Spark1.6中添加的一个新抽象,是DataFrame的一个扩展。它提供了RDD的优势(强类型,使用强大的lambda函数的能力)以及spark SQL优化执行引擎的优点。DataSet也可以使用功能性的转换(操作map,flatMap,filter等等)。

DataSet是D爱他frame API的一个扩展,是SparkSQL最新的数据抽象

用户友好的API风格,即具有类型安全检查也具有DataFrame的查询优化特性

用样例类来对DataSet中定义数据的结构信息,样例类中每个属性的名称来直接映射到DataSet中的字段名称

DataSet是强类型的,必须可以有DataSet[Car],DataSet[Person]。

 DataFrame是DataSet的特例,DataFrame=DataSet[row],所以可以通过as方法将DataFrame转换为DataSet。Row是一个类型,跟Car、Person这些类型一样,所有的表结构信息都用Row来表示。获取数据时需要指定顺序。

 

四、DStream是什么?

DStream 是随时间推移而收到的数据的序列。在内部,每个时间区间收到的数据都作为 RDD 存在,每个DStream对应多个RDD,这些RDD是按照时间维度进行划分的, DStream 是 RDD 在实时数据处理场景下的一种封装。

关系:相当于一整条数据流DStream被切分成了多个RDD,每个DStream对应多个RDD;一个RDD对应多个partition

​ 形象理解:DStream 是对 RDD 的封装、是由 RDD 组成的序列;RDD 封装 一个时间区间的数据(之前都是一个文件一个RDD,现在是周期性的产生RDD,几秒钟一个)

对 DStream 中数据的操作是按照 RDD 为单位进行的

 

 

 

 

五、RDD、DataFrame、DataSet 三者的关系

1.在 SparkSQL 中 Spark 为我们提供了两个新的抽象,分别是 DataFrame 和 DataSet。他们和 RDD 有什么区别呢?首先从版本的产生上来看:

➢ Spark1.0 => RDD
➢ Spark1.3 => DataFrame
➢ Spark1.6 => Dataset
如果同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果。不同是的他们的执行效率和执行方式。在后期的 Spark 版本中,DataSet 有可能会逐步取代 RDD和 DataFrame 成为唯一的 API 接口。
v>
2. 三者的共性
➢ RDD、DataFrame、DataSet 全都是 spark 平台下的分布式弹性数据集,为处理超大型数据提供便利;
➢ 三者都有惰性机制,在进行创建、转换,如 map 方法时,不会立即执行,只有在遇到Action 如 foreach 时,三者才会开始遍历运算;
➢ 三者有许多共同的函数,如 filter,排序等;
➢ 在对 DataFrame 和 Dataset 进行操作许多操作都需要这个包:import spark.implicits._(在创建好 SparkSession 对象后尽量直接导入)
➢ 三者都会根据 Spark 的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出
➢ 三者都有 partition 的概念
➢ DataFrame 和 DataSet 均可使用模式匹配获取各个字段的值和类型
3.三者的区别
1) RDD
➢ RDD 一般和 spark mllib 同时使用
➢ RDD 不支持 sparksql 操作
2) DataFrame
➢ 与 RDD 和 Dataset 不同,DataFrame 每一行的类型固定为 Row,每一列的值没法直接访问,只有通过解析才能获取各个字段的值
➢ DataFrame 与 DataSet 一般不与 spark mllib 同时使用
v>
➢ DataFrame 与 DataSet 均支持 SparkSQL 的操作,比如 select,groupby 之类,还能注册临时表/视窗,进行 sql 语句操作
➢ DataFrame 与 DataSet 支持一些特别方便的保存方式,比如保存成 csv,可以带上表头,这样每一列的字段名一目了然
3) DataSet
➢ Dataset 和 DataFrame 拥有完全相同的成员函数,区别只是每一行的数据类型不同。DataFrame 其实就是 DataSet 的一个特例 type DataFrame = Dataset[Row]
➢ DataFrame 也可以叫 Dataset[Row],每一行的类型是 Row,不解析,每一行究竟有哪些字段,各个字段又是什么类型都无从得知,只能用上面提到的 getAS 方法或者共性中的第七条提到的模式匹配拿出特定字段。而 Dataset 中,每一行是什么类型是不一定的,在自定义了 case class 之后可以很自由的获得每一行的信息。
通俗的讲:
(1)相同点:
          都是分布式数据集
          DataFrame底层是RDD,但是DataSet不是,不过他们最后都是转换成RDD运行
          DataSet和DataFrame的相同点都是有数据特征、数据类型的分布式数据集(schema)
(2)不同点:
          (a)schema信息:
                RDD中的数据是没有数据类型的, DataFrame中的数据是弱数据类型,不会做数据类型检查,虽然有schema规定了数据类型,但是编译时是不会报错的,运行时才会报错, DataSet中的数据类型是强数据类型。
          (b)序列化机制:
                RDD和DataFrame默认的序列化机制是java的序列化,可以修改为Kyro的机制。
                DataSet使用自定义的数据编码器进行序列化和反序列化
 
六、相互转换关系

 

posted @   会飞的猪仔  阅读(862)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示