Spark RDD中的aggregate函数 -JAVA8 lambda风格实现求平均数(不用mean函数)

先转载一篇文章,好好看,看明白了我们再看实现--

http://blog.csdn.net/qingyang0320/article/details/51603243

http://blog.csdn.net/a1628864705/article/details/52476161

下面我们用Java 8 lambda表达式实现:

package test;

import java.util.ArrayList;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;

public class Test {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf();
        conf.setAppName("Word count");
        conf.setMaster("local[2]");
        @SuppressWarnings("resource")
        JavaSparkContext sc = new JavaSparkContext(conf);
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1); 
        list.add(2);
        list.add(3);
        list.add(4);
        //初始化Rdd
        JavaRDD<Integer> rdd = sc.parallelize(list);
        //第二和第三个参数为函数的匿名实现(lambda形式 )
        Tuple2<Double, Integer> t = rdd.aggregate(new Tuple2<Double, Integer>(0.0, 0), 
                (x,y)->new Tuple2<Double, Integer>(x._1+y,x._2+1),
                (x,y)->new Tuple2<Double, Integer>(x._1+y._1,x._2+y._2));
        System.out.println(t._1/t._2);
    }

}


aggregate(T,(T,U)->T,(T,T)->T)

第一个参数为后面计算中的初始值,和返回值同类型;

第二个参数,在单个分区中,用初始值和该分区第一个元素进行求值,然后把结果迭代运行到该分区计算结束,返回该分区的计算值)

第三个参数,第二个函数中计算的个分区的结果,再进行求值(这里就是求和(sum相加,数量相加)),返回最终结果

得到结果

System.out.println(t._1/t._2);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值