什么是rdd
时间: 2025-04-25 12:32:31 浏览: 43
### RDD概念及原理
#### 弹性分布式数据集(RDD)
弹性分布式数据集(Resilient Distributed Dataset,简称 RDD)是 Spark 中最基本的数据抽象[^3]。RDD 表示一个不可变、可分区、里面的元素可以并行计算的集合。RDD 可以通过两种方式创建:
- **从外部数据源加载**:比如 HDFS 文件系统中的文件。
- **由驱动器程序平行化已有的集合**:例如使用 `sc.parallelize` 方法。
RDD 支持两种类型的操作:
- **转换 (Transformations)** :返回一个新的 RDD 而不是立即执行操作。常见的转换有 `map()`、`filter()` 等等。每次应用转换函数时会生成新的 RDD 实例。
```scala
val numbers = sc.parallelize(List(1, 2, 3))
val squaredNumbers = numbers.map(x => x * x)
```
- **行动 (Actions)** : 对 RDD 执行计算,并将结果返回给驱动节点或写入外部存储系统。典型例子包括 `reduce()`、`collect()` 和 `count()` 等。
除了上述特性外,RDD 还具有以下几个重要属性:
- **惰性求值**: 当定义了一个 RDD 后并不会立刻触发任何实际运算;只有当遇到 Action 类型的操作才会真正启动整个 DAG 计算流程[^4]。
- **持久化机制**: 用户可以选择将中间结果保存下来以便后续重用,从而减少重复计算开销。这可以通过调用 `persist()` 或者 `cache()` 来实现。
```scala
val cachedRdd = rdd.cache()
```
- **血缘关系(Lineage)**: 每个 RDD 都记录着其是如何被构建出来的历史信息——即所谓的 Lineage Information。如果某个 partition 失效,则可以根据此 lineage information 重新计算得到该部分数据而不是全部重新开始。
为了更好地理解如何控制 RDD 的分区情况,下面给出了一段 Scala 代码演示了怎样自定义输入列表中元素分配到不同分区的情况[^5]:
```scala
import org.apache.spark.{SparkConf, SparkContext}
object PartitionExample {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[*]").setAppName("Partition Example")
val sc = new SparkContext(conf)
// 创建包含两个分区的 RDD
val rdd = sc.makeRDD(List(1, 3, 8, 9), 2)
// 将内容按分区保存至指定路径下查看具体分布状况
rdd.saveAsTextFile("./output/partition_example")
sc.stop()
}
}
```
这段代码展示了如何手动设置 RDD 的分区数量,并观察最终输出文件夹内的文件数目来验证分区效果。
阅读全文
相关推荐


















