今天,我準備列出PairRDD的標準RDD轉化操作的函數列表。之後會具體分析,之前我們討論過的有關傳遞函數的規則也同樣適用於pairRDD。由於pairRDD中包含二元組,所以需要傳遞的函數應當操作二元組而不是獨立的元素。下面我會總結對pairRDD的一些轉化操作。
函數名 | 目的 | 示例 | 結果 |
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)} |
函數名 | 目的 | 示例 | 結果 |
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的各種操作,先從聚合操作開始。