在 Apache Spark 中,RDD(Resilient Distributed Dataset)是一种基本的分布式数据结构,用于在集群上并行处理数据。RDD 是一个不可变的、可分区的记录集合,可以并行操作,具有容错性和弹性。以下是有关 RDD 的一些重要概念和操作:

1. 创建 RDD:

1.1 从集合创建:
val data = 1 to 100
val rdd = sc.parallelize(data)

1.2 从外部数据源创建:
val rdd = sc.textFile("hdfs://path/to/file.txt")

2. 转换操作:

RDD 支持多种转换操作,用于生成新的 RDD。这些转换是惰性的,只有在执行动作操作时才会触发计算。

2.1 Map 转换:
val doubledRDD = rdd.map(x => x * 2)

2.2 Filter 转换:
val filteredRDD = rdd.filter(x => x % 2 == 0)

2.3 FlatMap 转换:
val flatMappedRDD = rdd.flatMap(x => Array(x, x * 2))

2.4 ReduceByKey 转换:
val keyValuePairs = rdd.map(x => (x % 2, x))
val reducedByKeyRDD = keyValuePairs.reduceByKey((a, b) => a + b)

3. 动作操作:

动作操作触发对 RDD 进行计算并返回结果。

3.1 Collect 动作:
val result = rdd.collect()

3.2 Count 动作:
val count = rdd.count()

3.3 Reduce 动作:
val sum = rdd.reduce((a, b) => a + b)

3.4 SaveAsTextFile 动作:
rdd.saveAsTextFile("hdfs://path/to/output")

4. 惰性评估和依赖关系:

RDD 的转换操作是惰性的,只有在执行动作时才会进行实际计算。每个 RDD 之间都存在依赖关系,这样 Spark 才能进行容错性和弹性计算。依赖关系分为窄依赖(Narrow Dependency)和宽依赖(Wide Dependency)。

5. 持久化:

RDD 可以通过 persist() 或 cache() 方法进行持久化,以便在迭代计算中重用数据。
rdd.persist()
// 或
rdd.cache()

6. 示例:WordCount 示例

以下是一个使用 Scala 编写的简单 WordCount 示例,演示如何使用 RDD 进行基本的文本处理:
val textFile = sc.textFile("hdfs://path/to/input.txt")
val wordCounts = textFile
  .flatMap(line => line.split(" "))
  .map(word => (word, 1))
  .reduceByKey(_ + _)

wordCounts.saveAsTextFile("hdfs://path/to/output")

在这个示例中,我们从文本文件创建一个 RDD,然后对每一行进行切分并计算每个单词的出现次数,最后保存结果到输出目录。

这只是 Spark RDD 的基础,Spark 还提供了许多其他功能,例如 Spark SQL、Spark Streaming、MLlib 等。详细信息可以在 [Spark 官方文档](https://spark.apache.org/documentation.html) 中找到。


转载请注明出处:http://www.pingtaimeng.com/article/detail/9338/Spark