HoRain云小助手:个人主页
个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏名称 |
专栏介绍 |
《C语言》 |
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
《网络协议》 |
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
《docker容器精解篇》 |
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
《linux系列》 |
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
《python 系列》 |
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
《试题库》 |
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
⛳️ 推荐
专栏介绍
1. 基本定义与特性
2. 核心区别详解
**(1) 数据抽象与类型安全
(2) 性能优化
(3) 使用场景
3. 代码示例对比
(1) 创建方式
(2) 操作与类型安全
4. 执行计划优化对比
5. 如何选择?
总结
在 Apache Spark 中,RDD、DataFrame 和 Dataset 是三种核心数据抽象,各自适用于不同的场景。以下是它们的核心区别:
特性 | RDD | DataFrame | Dataset |
---|---|---|---|
抽象层级 | 低级 API(弹性分布式数据集) | 高级 API(表结构数据抽象) | 高级 API(类型安全的 DataFrame) |
数据类型 | 支持任意类型(结构化/非结构化) | 仅支持结构化数据(Row 对象) | 支持结构化数据 + 类型安全(强类型) |
优化能力 | 无自动优化,需手动调优 | Catalyst 优化器 + Tungsten 内存管理 | Catalyst 优化器 + 编码器(Encoder) |
类型安全 | 无类型安全检查(运行时错误) | 无类型安全检查(运行时错误) | 编译时类型安全检查(强类型) |
序列化方式 | Java 序列化(性能低) | Tungsten 二进制格式(高效) | Encoder(二进制 + 类型感知) |
语言支持 | Scala、Java、Python、R | Scala、Java、Python、R | 仅 Scala、Java(Python/R 有限支持) |
RDD
JVM 对象
形式存储,类型错误在运行时才会暴露。RDD[(String, Int)]
表示键值对集合。DataFrame
Row
对象形式存储。df.select("wrong_column")
在运行时报错)。DataFrame = Dataset[Row]
(Spark 2.0+ 后 DataFrame 是 Dataset 的别名)。Dataset
case class
)形式存储,类型错误在编译时捕获。Dataset[User]
(User
是自定义的 Scala 类)。RDD
cache()
、persist()
)。DataFrame/Dataset
场景 | 适用抽象 | 示例 |
---|---|---|
非结构化数据处理 | RDD | 文本日志解析、图像处理 |
结构化数据分析(SQL 类) | DataFrame | 聚合统计、SQL 查询 |
类型安全的 ETL 管道 | Dataset(Scala/Java) | 复杂业务逻辑 + 编译时类型检查 |
// RDD:从集合创建
val rdd: RDD[String] = spark.sparkContext.parallelize(List("a", "b", "c"))
// DataFrame:从 JSON 文件创建
val df: DataFrame = spark.read.json("data.json")
// Dataset:从 case class 创建
case class User(name: String, age: Int)
val ds: Dataset[User] = spark.createDataset(Seq(User("Alice", 30)))
// RDD:类型安全的转换(编译时检查)
val rdd2: RDD[Int] = rdd.map(_.length) // 正确:String → Int
// DataFrame:运行时错误(列名错误)
df.select("invalid_column") // 运行时抛出 AnalysisException
// Dataset:编译时类型检查
ds.filter(_.age > 25) // 正确:强类型操作
ds.filter(_.salary > 25) // 编译错误:salary 字段不存在
RDD
执行计划由用户定义的转换链直接生成,无优化。
== Physical Plan ==
*(1) SerializeFromObject [value#1]
+- Scan[obj#0]
DataFrame/Dataset
Catalyst 优化器合并/重排操作(如过滤提前)。
== Optimized Logical Plan ==
Filter (age#2 > 25)
+- Project [name#1, age#2]
+- Relation[age#2,name#1] json
抽象 | 优势 | 劣势 |
---|---|---|
RDD | 灵活、支持非结构化数据 | 手动优化、性能低、无类型安全 |
DataFrame | 自动优化、易用(SQL 友好) | 无编译时类型检查 |
Dataset | 类型安全 + 优化能力(Scala/Java) | 仅限 Scala/Java,学习成本略高 |
在 Spark 2.0+ 中,DataFrame 和 Dataset API 已统一,DataFrame = Dataset[Row]
,建议优先使用结构化 API(DataFrame/Dataset)以利用性能优化。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!
如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!
Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!