理解 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对应多个partition
形象理解:DStream 是对 RDD 的封装、是由 RDD 组成的序列;RDD 封装 一个时间区间的数据(之前都是一个文件一个RDD,现在是周期性的产生RDD,几秒钟一个)
对 DStream 中数据的操作是按照 RDD 为单位进行的
五、RDD、DataFrame、DataSet 三者的关系
1.在 SparkSQL 中 Spark 为我们提供了两个新的抽象,分别是 DataFrame 和 DataSet。他们和 RDD 有什么区别呢?首先从版本的产生上来看:
都是分布式数据集
DataFrame底层是RDD,但是DataSet不是,不过他们最后都是转换成RDD运行
DataSet和DataFrame的相同点都是有数据特征、数据类型的分布式数据集(schema)
(2)不同点:
(a)schema信息:
RDD中的数据是没有数据类型的, DataFrame中的数据是弱数据类型,不会做数据类型检查,虽然有schema规定了数据类型,但是编译时是不会报错的,运行时才会报错, DataSet中的数据类型是强数据类型。
(b)序列化机制:
RDD和DataFrame默认的序列化机制是java的序列化,可以修改为Kyro的机制。
DataSet使用自定义的数据编码器进行序列化和反序列化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~