cogroup
groupByKey是对单个 RDD 的数据进行分组,
cogroup() 是对多个共享同一个键的 RDD 进行分组
例如
RDD1.cogroup(RDD2) 会将RDD1和RDD2按照相同的key进行分组,得到(key,RDD[key,Iterable[value1],Iterable[value2]])的形式
cogroup也可以多个进行分组
例如RDD1.cogroup(RDD2,RDD3,…RDDN), 可以得到(key,Iterable[value1],Iterable[value2],Iterable[value3],…,Iterable[valueN])
案例,scoreDetail存放的是学生的优秀学科的分数,scoreDetai2存放的是刚刚及格的分数,scoreDetai3存放的是没有及格的科目的分数,我们要对每一个学生的优秀学科,刚及格和不及格的分数给分组统计出来
JavaRDD<Tuple2<String,Float>> scoreDetails1 = javaSparkContext.parallelize(Arrays.asList(new Tuple2("xiaoming", 75), new Tuple2("xiaoming", 90), new Tuple2("lihua", 95), new Tuple2("lihua", 96)));JavaRDD<Tuple2<String,Float>> scoreDetails2 = javaSparkContext.parallelize(Arrays.asList(new Tuple2("xiaoming", 75), new Tuple2("lihua", 60), new Tuple2("lihua", 62)));JavaRDD<Tuple2<String,Float>> scoreDetails3 = javaSparkContext.parallelize(Arrays.asList(new Tuple2("xiaoming", 75), new Tuple2("xiaoming", 45), new Tuple2("lihua", 24), new Tuple2("lihua", 57)));//将JavaRDD<Tuple2<String,Float>> 类型转换为 JavaPairRDD<String, Float>
JavaPairRDD<String, Float> scoreMapRDD1 = JavaPairRDD.fromJavaRDD(scoreDetails1);
JavaPairRDD<String, Float> scoreMapRDD2 = JavaPairRDD.fromJavaRDD(scoreDetails2);
JavaPairRDD<String, Float> scoreMapRDD3 = JavaPairRDD.fromJavaRDD(scoreDetails3);JavaPairRDD<String, Tuple3<Iterable<Float>, Iterable<Float>, Iterable<Float>>> cogroup = scoreMapRDD1.cogroup(scoreMapRDD2, scoreMapRDD3);System.out.println(cogroup.collect());
//cogroup算子运行的结果
//[(lihua,([95, 96],[60, 62],[24, 57])), (xiaoming,([75, 90],[75],[75, 45]))]