Spark Basic RDD 操作示例

Transformation

基本 RDD 的 transformation

假设有一个 RDD ,其中的元素有 {1, 2, 3, 3}:

函数 目的 示例 结果
map() 将函数应用到 RDD 中的每一个元素并以 RDD 的形式返回结果 rdd.map(x => x+1) {2, 3, 4, 4}
flatMap() 将函数应用到 RDD 中的每一个元素,并以 RDD 的形式返回 iterator 的内容。通常用于提取词语。 rdd.flatMap(x => x.to(3)) {1, 2, 3, 2, 3, 3, 3}
filter() 返回一个 RDD, 该 RDD 中仅包含了能够通过 filter() 函数的元素 rdd.filter(x => x != 1) {2, 3, 3}
distinct() 去除重复项 rdd.distinct() {1, 2, 3}

两个 RDD 的 transformation

假设有两个 RDD, 分别包含了 {1, 2, 3} 和 {3, 4, 5}:

函数 目的 示例 结果
union() 并集,生成一个包含了两个 RDD 元素的 RDD rdd.union(other) {1, 2, 3, 3, 4, 5}
intersection() 交集,生成 RDD 包含了在两个 RDD 中同时出现的元素 rdd.intersection(other) {3}
subtract() 移除一个 RDD 中的内容 rdd.subtract(other) {1, 2}
cartesian() 以另一个 RDD 的 笛卡尔积 rdd.cartesian(other) {(1, 3), (1, 4), (1, 5), (2, 3), (2, 4)}, ..., (3, 5)

Action

假设有一个 RDD ,其中的元素有 {1, 2, 3, 3}:

函数 目的 示例 结果
collect() 返回 RDD 中的所有元素 rdd.collect() {1, 2, 3, 3}
count() RDD 中的元素数目 rdd.count() 4
countByValue() RDD 中每个元素出现的次数 rdd.countByValue() {(1, 1), (2, 1), (3, 2)}
take(num) 返回 RDD 中的 num 个元素 rdd.take(2) {1, 2}
top(num) 返回 RDD 中的前 num 个元素 rdd.top(2) {3, 3}
takeOrdered(num)(ordering) 基于 ordering 返回 num 个元素 rdd.takeOrdered(2)(myOrdering) {3, 3}
takeSample(withReplacement, num, [seed]) 随机返回 num 个元素 rdd.takeSample(false, 1) 不确定
reduce(func) 并行地组合 RDD 中的元素(比如,sum) rdd.reduce((x, y) => x + y) 9
fold(zero)(func) reduce() 一样只是需要提供一个 0 rdd.fold(0)((x, y) => x + y) 9
aggregate(zeroValue)(seqop, combop) reduce() 相似,不过用于返回不同类型 rdd.aggregate((0, 0))((x, y) => (x._1 + y, x._2 + 1), (x, y) => (x._1 + y._1, x._2 + y._2)) (9, 4)
foreach(func) 将 func 应用到 RDD 中的每一个元素 rdd.foreach(func)

以上内容参见 <<Learning Spark>>, 其代码示例可在 GitHub 上找到 learning-spark.

推荐阅读更多精彩内容