//利用aggregate操作计算均值
public static void aggregateDemo(JavaSparkContext sc){
/**
* 创建RDD 最简单的方式就是把程序中一个已有的集合传给SparkContext 的parallelize()方法
* Scala:val lines = sc.parallelize(List("pandas", "i like pandas"))
* java:JavaRDD<String> lines = sc.parallelize(Arrays.asList("pandas", "i like pandas"));
*/
JavaRDD rdd = sc.parallelize(Arrays.asList(1,2,3,4,5,6,7,8,9));
//创建一个本地类用来 保存 总值、个数、取均值操作
class avgCount implements Serializable{
public int total;
public int num;
public avgCount(int total, int num) {
this.total = total;
this.num = num;
}
public double avg(){
return total/(double)num;
}
}
/**
* aggregate接收两个函数,和一个初始化值.
* seqOp函数用于每一个分区操作.
* combOp用于聚集所有分区的结果.
* 每一个分区的聚集,和最后所有分区的聚集都需要初始化值的参与.
*/
avgCount initial = new avgCount(0,0);
avgCount result = (avgCount) rdd.aggregate(initial, new Function2<avgCount, Integer, avgCount>() {
/**
* seqOp函数用于每一个分区操作,
* @param a,初始对象initial为(0,0)
* @param i,(1,2,3,4,5,6,7,8,9)
* @return a=(0+1+2+3+4+5+6+7+8+9,0+1+1+1+1+1+1+1+1+1)=(45,9)
* @throws Exception
*/
@Override
public avgCount call(avgCount a, Integer i) throws Exception {
a.total += i;
a.num += 1;
return a;
}
}, new Function2<avgCount,avgCount,avgCount>() {
/**
* combOp用于聚集所有分区的结果.
* 本案例只有一个分区,所以返回就是o(45,9)
*/
@Override
public avgCount call(avgCount o, avgCount o2) throws Exception {
o.total+=o2.total;
o.num+=o2.num;
return o;
}
});
System.out.println(result.avg());
}
RDD操作aggregate学习
最新推荐文章于 2023-05-26 12:43:20 发布