Scala 学习之 aggregate函数

fold和reduce都要求函数的返回值类型需要和我们所操作的RDD类型相同,但是我们有时确实需要一个不同类型的返回值。eg:

在计算平均值时,需要记录便利过程中的计数以及元素的数量,这就需要我们返回一个二元组。可以先对数据使用map操作,来把元素转移为改元素和1的二元组,也就是我们希望的返回类型。这样reduce就可以以二元组的形式进行归约。

aggregate函数把我们从返回值类型必须与输入RDD类型相同的限制中解脱出来。与fold相似,使用aggregate时,需要我们期待返回的类型的初始值,然后通过一个函数吧RDD中的元素合并起来放入累加器。考虑到每个节点是在本地进行累加的,最终 还需要提供第二个函数来将累加器两两合并。eg:

1 val z = sc. parallelize ( List (1 ,2 ,3 ,4 ,5 ,6) , 2)
2 val result = z.aggregate((0,0))(//初始值
3   (acc,value)=>(acc._1+value,acc._2+1),//累加器 (元组累加元组结果,RDD单个元素值)=>(元组累加结果+RDD单个元素,元组累加计数+1)
4   (acc1,acc2)=>(acc1._1+acc2._1,acc1._2+acc2._2)//combine 合并函数 合并元组累加结果
5 )
6 val avg = result._1/result._2.toDouble

 

posted on 2016-06-26 14:06  273度  阅读(1873)  评论(0编辑  收藏  举报

导航