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的各种操作,先从聚合操作开始。

版权声明:本文为DK_ing原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/DK_ing/article/details/90758269