Spark 的基本数据模型主要包括 RDD(弹性分布式数据集)DataFrameDataset,它们构成了 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 序列化)
适用场景 非结构化数据、复杂逻辑 结构化数据分析 类型安全的需求

演进趋势

  1. Spark 1.x:仅 RDD。
  2. Spark 2.x:统一 API(DataFrame = Dataset[Row]),推荐优先使用 DataFrame/Dataset。
  3. Spark 3.x:进一步优化 DataFrame/Dataset,RDD 仅用于兼容旧代码。

如何选择数据模型?

  1. 默认用 DataFrame:性能最好,代码简洁(适合大多数场景)。
  2. 需要类型安全时用 Dataset(仅 Scala/Java)。
  3. 只有 RDD 能实现的逻辑才用 RDD:如自定义分区、复杂迭代计算。

总结

  • RDD:底层抽象,灵活但性能较差。
  • DataFrame:高层抽象,结构化 + 自动优化,推荐首选
  • Dataset:类型安全的 DataFrame(限 Scala/Java)。