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

来源:互联网 发布:帝国cms 搜索代码 编辑:程序博客网 时间:2024/06/04 19:55

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

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



0 0
原创粉丝点击