Spark Basic RDD 操作示例

weixin_34148340發表於2017-06-01

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.

相關文章