今天,我准备列出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的各种操作,先从聚合操作开始。