RDD操作aggregate学习

//利用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());
    }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值