Spark RDD 概述
RDD(Resilient Distributed Dataset)是 Spark 的核心数据结构,代表一个不可变、可分区的分布式数据集。RDD 支持并行操作,具备容错性,能够高效处理大规模数据。
RDD 的特性
- 不可变性(Immutable):RDD 一旦创建无法修改,只能通过转换操作生成新的 RDD。
- 分区(Partitioned):数据分布在多个节点上,每个分区可独立处理。
- 容错性(Fault-tolerant):通过血缘关系(Lineage)记录转换过程,丢失时可重新计算恢复。
- 延迟计算(Lazy Evaluation) :转换操作不会立即执行,需触发行动操作(如
collect())时才计算。
RDD 的创建方式
-
从集合创建
使用
parallelize()方法将本地集合转换为 RDD。pythonfrom pyspark import SparkContext sc = SparkContext("local", "RDD Example") data = [1, 2, 3, 4, 5] rdd = sc.parallelize(data) -
从外部存储系统加载
通过
textFile()从 HDFS、本地文件系统等读取数据。pythonrdd = sc.textFile("hdfs://path/to/file.txt") -
从其他 RDD 转换
通过转换操作(如
map()、filter())生成新的 RDD。pythonsquared_rdd = rdd.map(lambda x: x * x)
RDD 的常用操作
-
转换操作(Transformations)
map(func):对每个元素应用函数。filter(func):保留满足条件的元素。flatMap(func):先映射后扁平化(如拆分单词)。reduceByKey(func):对键值对按键聚合。
-
行动操作(Actions)
collect():返回所有元素到驱动程序。count():统计元素数量。take(n):返回前 n 个元素。saveAsTextFile(path):保存到文件系统。
RDD 持久化
通过 persist() 或 cache() 将 RDD 缓存到内存或磁盘,避免重复计算。
python
rdd.persist(StorageLevel.MEMORY_ONLY) # 仅内存
rdd.cache() # 默认内存缓存
RDD 的依赖关系
- 窄依赖(Narrow Dependency) :每个父 RDD 分区最多被一个子分区依赖(如
map)。 - 宽依赖(Wide Dependency) :父分区可能被多个子分区依赖(如
reduceByKey),需 Shuffle 操作。
示例:词频统计
python
text_rdd = sc.textFile("input.txt")
words_rdd = text_rdd.flatMap(lambda line: line.split(" "))
word_counts = words_rdd.map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b)
word_counts.saveAsTextFile("output")
RDD 的局限性
- 不支持结构化数据的优化(如列式存储),需使用 DataFrame/Dataset。
- 频繁的 Shuffle 操作可能影响性能。
通过合理设计分区和持久化策略,RDD 能够高效处理大规模分布式数据任务。