RDD、DataFrame 和 DataSet 简单介绍
RDD
Spark的基石,像分布式数组:
- 不可变、分区的数据集合
- 支持并行计算和自动容错
- 两种操作:转换(transform)和行动(action)
- 灵活但无结构,需手动优化
- 适合底层数据处理,常与MLlib搭配
DataFrame
像数据库表格的升级版:
- 带Schema的二维数据结构
- 支持SQL查询和优化器
- API比RDD更友好(类似Pandas)
- 运行时类型检查
- 结构化数据处理首选
DataSet
DataFrame的加强版:
- 结合RDD的类型安全和DataFrame的优化
- 编译时类型检查(如DataSet[User])
- 编码器高效序列化
- 适合复杂业务场景
区别
核心特性对比
| 维度 | RDD | DataFrame | DataSet |
|---|---|---|---|
| 类型安全 | 编译时类型安全 | 仅运行时类型检查 | 编译时类型安全 |
| 序列化 | Java序列化(全对象) | 二进制序列化(堆外存储) | 编码器(按需访问) |
| 优化 | 无 | Catalyst查询优化 | Catalyst查询优化 |
| API风格 | 面向对象(方法链) | 声明式(SQL风格) | 混合式(两者优点) |
| GC影响 | 高(频繁对象创建) | 低(堆外内存) | 中(智能编码器) |
性能天梯
处理速度:DataFrame ≈ DataSet > RDD (最高可差10倍)
内存占用:RDD > DataSet > DataFrame
开发效率:DataSet ≈ DataFrame > RDD
最佳使用场景
RDD
- 需要精细控制底层操作时
- 使用非结构化数据(如文本流)
- 与遗留代码集成
- 配合MLlib的早期版本
DataFrame
- 处理结构化/半结构化数据(JSON, Parquet等)
- 需要SQL交互时
- 追求最佳性能
- 进行ETL流水线操作
DataSet
- 需要类型安全的复杂业务逻辑
- 使用Scala强类型系统
- 平衡性能与开发体验
- 处理领域对象(如User, Product等)
1872

被折叠的 条评论
为什么被折叠?



