先转载一篇文章,好好看,看明白了我们再看实现--
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);