Spark 的基本数据模型
Spark 的基本数据模型主要包括 RDD(弹性分布式数据集)、DataFrame 和 Dataset,它们构成了 Spark 处理数据的核心抽象。以下是它们的详细对比和特点:
1. RDD(Resilient Distributed Dataset)
核心特点:
- 分布式:数据分片(Partition)存储在集群多个节点上。
- 弹性(Resilient):通过血缘关系(Lineage)和持久化(Persist)实现容错。
- 不可变:一旦创建,不能修改,只能通过转换操作生成新的 RDD。
- 惰性求值:只有触发行动操作(如
collect()
)时才会执行计算。
适用场景:
- 需要低层次控制(如自定义分区、复杂业务逻辑)。
- 处理非结构化数据(如文本、日志)。
2. DataFrame
核心特点:
- 结构化数据模型:数据以行和列的形式组织(类似关系型数据库表)。
- Schema 支持:明确字段名和类型(如
name: String, age: Int
)。 - 优化引擎:通过 Catalyst 优化器 和 Tungsten 二进制格式 提升性能。
- API 风格:支持 SQL 查询和 DSL(领域特定语言)。
适用场景:
- 处理结构化/半结构化数据(如 JSON、CSV、Parquet)。
- 需要高性能分析(如聚合、Join)。
[[RDD VS Dataframe]]
3. Dataset(仅 Scala/Java)
核心特点:
- 结合 RDD 和 DataFrame 的优点:强类型(编译时类型检查) + 优化执行。
三者的关系与演进
特性 | RDD | DataFrame | Dataset(Scala/Java) |
---|---|---|---|
数据类型 | 任意对象 | 结构化(Row 对象) | 强类型(如 Person ) |
优化 | 无 | Catalyst + Tungsten | Catalyst + Tungsten |
语言支持 | 所有语言 | 所有语言 | 仅 Scala/Java |
性能 | 较低(JVM 序列化) | 高 | 高 |
适用场景 | 非结构化数据、复杂逻辑 | 结构化数据分析 | 类型安全的需求 |
演进趋势:
- Spark 1.x:仅 RDD。
- Spark 2.x:统一 API(DataFrame = Dataset[Row]),推荐优先使用 DataFrame/Dataset。
- Spark 3.x:进一步优化 DataFrame/Dataset,RDD 仅用于兼容旧代码。
如何选择数据模型?
- 默认用 DataFrame:性能最好,代码简洁(适合大多数场景)。
- 需要类型安全时用 Dataset(仅 Scala/Java)。
- 只有 RDD 能实现的逻辑才用 RDD:如自定义分区、复杂迭代计算。
总结
- RDD:底层抽象,灵活但性能较差。
- DataFrame:高层抽象,结构化 + 自动优化,推荐首选。
- Dataset:类型安全的 DataFrame(限 Scala/Java)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Min的博客!
评论