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