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()返回一个仅包含键的RDDrdd.keys(){1, 3, 3}
values()返回一个仅包含值的RDDrdd.values(){2, 4, 6}
sortByKey()返回一个根据键排序的RDDrdd.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的各种操作,先从聚合操作开始。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值