SPARK RDD VS Dataframe
基于 RDD 的 API 和 基于 DataFrame/Dataset 的 API 在 Spark 中有本质的不同,主要体现在以下几个方面:
1. 数据表示方式
| RDD | DataFrame/Dataset | 
|---|---|
| 非结构化/半结构化,存储的是原始的 Java/Scala/Python 对象 | 结构化,数据以列式存储(类似于关系型数据库的表) | 
| 没有内置的 Schema(字段名和类型) | 自带 Schema(字段名 + 数据类型) | 
| 数据以 (key, value)等基本形式存储 | 数据以 Row 对象存储,并带有列名 | 
示例:
- RDD:("apple", 3)(只是一个元组,Spark 不知道它的含义)
- DataFrame:Row(word="apple", count=3)(明确知道word是字符串,count是整数)
2. 优化方式
| RDD | DataFrame/Dataset | 
|---|---|
| 无优化,直接按代码逻辑执行 | Catalyst 优化器 自动优化执行计划(如谓词下推、列裁剪、Join 优化等) | 
| 需要手动优化(如 persist()、repartition()) | 自动优化存储格式(如 Parquet 列式存储) | 
| Tungsten 二进制存储(较晚引入) | 默认使用 Tungsten 二进制格式,减少序列化开销 | 
示例:
| 1 | # RDD 版本(无优化) | 
DataFrame 的优化器可能会合并 filter 和 select,减少数据扫描量。
3. API 风格
| RDD | DataFrame/Dataset | 
|---|---|
| 函数式编程( map、filter、reduceByKey) | 声明式 SQL 风格( select、where、groupBy) | 
| 需要手动编写 lambda 表达式 | 可以使用 SQL 表达式 或 DSL(领域特定语言) | 
| 适合复杂业务逻辑 | 适合结构化数据处理 | 
示例:
| 1 | # RDD 方式(函数式) | 
4. 执行效率
| RDD | DataFrame/Dataset | 
|---|---|
| JVM 对象序列化(较慢) | Tungsten 二进制格式(减少序列化开销) | 
| 无执行计划优化 | Catalyst 优化器 生成最优执行计划 | 
| 适合低层次控制 | 适合大规模数据分析 | 
性能对比:
- DataFrame 通常比 RDD 快 2-10 倍(特别是聚合、Join 等操作)。
- RDD 更适合 细粒度控制(如自定义分区、复杂计算)。
5. 适用场景
| RDD | DataFrame/Dataset | 
|---|---|
| 非结构化数据(文本、日志) | 结构化/半结构化数据(JSON、CSV、Parquet) | 
| 需要自定义计算逻辑 | 需要 SQL 查询或聚合分析 | 
| 低层次 API(如机器学习底层) | 高层次 API(如 Spark SQL、MLlib) | 
总结
| 特性 | RDD | DataFrame | 
|---|---|---|
| 数据格式 | 原始对象 | 结构化(带 Schema) | 
| 优化方式 | 无优化 | Catalyst + Tungsten | 
| API 风格 | 函数式 | SQL/DSL | 
| 执行效率 | 较慢 | 较快(优化后) | 
| 适用场景 | 非结构化数据、复杂逻辑 | 结构化数据、分析查询 | 
推荐:
- 优先使用 DataFrame/Dataset(性能更好,代码更简洁)。
- 仅在需要精细控制时用 RDD(如自定义分区、复杂业务逻辑)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Min的博客!
 评论
