Spark每日半小時(7)——PairRDD的轉化操作

今天,我準備列出PairRDD的標準RDD轉化操作的函數列表。之後會具體分析,之前我們討論過的有關傳遞函數的規則也同樣適用於pairRDD。由於pairRDD中包含二元組,所以需要傳遞的函數應當操作二元組而不是獨立的元素。下面我會總結對pairRDD的一些轉化操作。

PairRDD的轉化操作(以鍵值對集合{(1,2),(3,4),(3,6)}爲例)
函數名 目的 示例 結果
reduceByKey(func) 合併具有相同鍵的值 rdd.reduceByKey((x,y)=>x+y) {(1,2), (3,10)}
groupByKey() 對具有相同的值進行分組 rdd.groupByKey() {(1,[2]),(3, [4,6])}

combineByKey(createCombiner,

mergeValue,mergeCombiners,partitioner)

使用不同的返回類型合併具有相同鍵的值    
mapValues(func) 對pairRDD中的每個值應用rdd.mapValues(x=>x+1)一個函數而不改變鍵 rdd.mapValues(x=>x+1) {(1,3), (3,5), (3,7)}
flatMapValues(func) 對pairRDD中的每個值應用一個返回迭代器的函數,然後對返回的每個元素都生成一個對應原鍵的鍵值對記錄。通常用於符號化 rdd.flatMapValues(x=>(x to 5)) {(1,2), (1,3), (1,4), (1,5), (3,4), (3,5)}
keys() 返回一個僅包含鍵的RDD rdd.keys() {1, 3, 3}
values() 返回一個僅包含值的RDD rdd.values() {2, 4, 6}
sortByKey() 返回一個根據鍵排序的RDD rdd.sortByKey() {(1,2), (3,4), (3,6)}
針對兩個pairRDD的轉化操作(rdd={(1,2),(3,4),(3,6)}other={(3,9)})
函數名 目的 示例 結果
subtractByKey 刪掉RDD中鍵與otherRDD中的鍵相同的元素 rdd.subtractByKey(other) {(1, 2)}
join 對兩個RDD進行內連接 rdd.join(other) {(3, (4, 9)), (3, (6, 9))}
rightOuterJoin 對兩個RDD進行連接操作,確保第一個RDD的鍵必須存在(右外連接) rdd.rightOuterJoin(other) {(3,(Some(4),9)),(3,(Some(6),9))}
leftOuterJoin 對兩個RDD進行連接操作,確保第二個RDD的鍵必須存在(左外連接) rdd.leftOuterJoin(other) {(1, (2,None)), (3, (4,Some(9))), (3, (6,Some(9)))}
cogroup 將兩個RDD中擁有相同鍵的數據分組到一起 rdd.cogroup(other) {(1,([2],[])), (3, ([4, 6],[9]))}

明天會開始詳細探討這些pairRDD的函數。

PairRDD也還是RDD,因此同樣支持RDD所支持的函數。下面來一個簡單的例子搞一搞。

/**
 * @author DKing
 * @description
 * @date 2019/6/3
 */
public class PairRDDTransactionSample {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf()
                .setAppName("TransactionSample")
                .setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);
        JavaRDD<String> lines = sc.textFile("README.md");
        JavaPairRDD<String, String> pairRDD = lines.mapToPair(
                (PairFunction<String, String, String>) s -> new Tuple2<>(s.split(" ")[0], s)
        );

        Function<Tuple2<String, String>, Boolean> longWordFilter =
                stringStringTuple2 -> (stringStringTuple2._2().length() < 20);

        JavaPairRDD<String, String> result = pairRDD.filter(longWordFilter);
    }
}

根據值篩選

有時,我們只想訪問pairRDD的值部分,這時操作二元組很麻煩。由於這是一種常見的使用模式,因此Spark提供了mapValue(func)函數,功能類似於map{case(x,y):(x,func(y))}。可以在很多例子中使用這些函數。

明天我們會討論pairRDD的各種操作,先從聚合操作開始。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章