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)]