当前位置: 代码迷 >> 综合 >> spark常用RDD算子 - cogroup
  详细解决方案

spark常用RDD算子 - cogroup

热度:29   发布时间:2024-02-05 13:43:43.0

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

 

  相关解决方案