spark之combineByKey(Java)

spark根据key做聚合的aggregateByKey,groupByKey,reduceByKey等常用算子其底层本质都是调用combineByKey实现的,即都是combineByKey的一种特殊情况,下面介绍下combineByKey算子

一、函数定义

 def combineByKey[C](  

     createCombiner: V => C,  

     mergeValue: (C, V) => C,  

     mergeCombiners: (C, C) => C,  

     partitioner: Partitioner,  

     mapSideCombine: Boolean = true,  

     serializer: Serializer = null)

二、参数说明

1、createCombiner:V => C ,分区内创建组合函数。这个函数把当前的值作为参数,此时我们可以对其做些附加操作(类型转换)并把它返回 (这一步类似于初始化操作)

 说明:同一分区内,同一个key,只有第一次出现的value才会运行此函数

2、mergeValue: (C, V) => C,分区内合并值函数。该函数把元素V合并到之前的元素C(createCombiner)上 (这个操作在每个分区内进行)

说明:同一分区内,同一个key,非第一次出现value运行此函数,其中C为上次的结果,V为本次值

3、mergeCombiners: (C, C) => C,多分区合并组合器函数。该函数把2个元素C合并

说明:这个操作在不同分区间进行

4、partitioner:自定义分区数,默认为HashPartitioner

5、mapSideCombine:是否在map端进行Combine操作,默认为true

三、Java用例

SparkSession spark = SparkSession.builder()
	    		.appName("ReadFileFun")
	    		.master("local[2]")
	    		.getOrCreate();//当前有SparkSession则获取,没有(包括被关闭的情况)则新建
SparkContext sc = spark.sparkContext();
JavaSparkContext  jsc = new JavaSparkContext(sc);
JavaRDD<Tuple2<Integer, Integer>> tupRdd = jsc.parallelize(Arrays.asList(
        new Tuple2<Integer, Integer>(1, 1), new Tuple2<Integer, Integer>(1, 2)
      , new Tuple2<Integer, Integer>(2, 3), new Tuple2<Integer, Integer>(2, 4)
      , new Tuple2<Integer, Integer>(3, 5), new Tuple2<Integer, Integer>(3, 6)
      , new Tuple2<Integer, Integer>(4, 7), new Tuple2<Integer, Integer>(4, 8)
      , new Tuple2<Integer, Integer>(5, 9), new Tuple2<Integer, Integer>(5, 10)
      , new Tuple2<Integer, Integer>(1, 9), new Tuple2<Integer, Integer>(1, 10)
        ), 3);
         
JavaPairRDD<Integer, Integer> pairRDD = JavaPairRDD.fromJavaRDD(tupRdd);
List<Tuple2<Integer, String>> collect = pairRDD
               .combineByKey(x ->{
        			 return x + "##0";
        		}, (c,v) -> {
        			return c + "," + v + "##0";
        		}, (c1,c2) -> {
        			return c1 + "," + c2;
        		})
               .collect();
System.err.println(collect);

输出结果:[(5,9##0,10##0), (1,1##0,2##0,9##0,10##0), (2,3##0,4##0), (3,5##0,6##0), (4,7##0,8##0)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值