函数aggregate
格式
def aggregate[S](z: => S)(seqop: (S, Int) => S,combop: (S, S) => S): S
原理
a.par.aggregate((0,0))((x,y)=>{(x._1+y,x._2+1)},(x,y)=>{(x._1+y._1,x._2+y._2)})
可能会把List分为多个区,例如3个,p1(1,2,3,4),p2(5,6,7),p3(8,9),第一个方法区内聚合,(1+2+3+4,1+1+1+1),(5+6+7,1+1+1),(8+9,1+1),第二个方法区间聚合,(10+18+17,4+3+2)
数组
val a = List(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
统计所有数之和
不分区
scala> a.aggregate(0)((x,y)=>{println("seqop",x,y,x+y);x+y},(x,y)=>{println(x,y,x+y);x+y})
(seqop,0,1,1)
(seqop,1,2,3)
(seqop,3,3,6)
(seqop,6,4,10)
(seqop,10,5,15)
(seqop,15,6,21)
(seqop,21,7,28)
(seqop,28,8,36)
(seqop,36,9,45)
(seqop,45,10,55)
(seqop,55,11,66)
(seqop,66,12,78)
(seqop,78,13,91)
(seqop,91,14,105)
(seqop,105,15,120)
(seqop,120,16,136)
(seqop,136,17,153)
(seqop,153,18,171)
(seqop,171,19,190)
(seqop,190,20,210)
(seqop,210,21,231)
(seqop,231,22,253)
(seqop,253,23,276)
(seqop,276,24,300)
res96: Int = 300
分区
scala> a.par.aggregate(0)((x,y)=>{println("seqop",x,y,x+y);x+y},(x,y)=>{println(x,y,x+y);x+y})
(seqop,0,1,1)
(seqop,0,20,20)
(seqop,0,12,12)
(seqop,0,22,22)
(seqop,0,23,23)
(seqop,23,24,47)
(seqop,0,2,2)
(seqop,0,11,11)
(11,12,23)
(seqop,0,19,19)
(seqop,0,7,7)
(seqop,0,10,10)
(10,23,33)
(seqop,0,6,6)
(seqop,0,13,13)
(seqop,0,4,4)
(seqop,0,14,14)
(seqop,0,16,16)
(seqop,0,9,9)
(seqop,0,5,5)
(22,47,69)
(seqop,0,8,8)
(8,9,17)
(7,17,24)
(24,33,57)
(seqop,0,21,21)
(seqop,0,3,3)
(20,21,41)
(5,6,11)
(seqop,0,17,17)
(seqop,14,15,29)
(seqop,17,18,35)
(16,35,51)
(4,11,15)
(19,41,60)
(2,3,5)
(60,69,129)
(13,29,42)
(1,5,6)
(42,51,93)
(6,15,21)
(93,129,222)
(21,57,78)
(78,222,300)
res103: Int = 300
统计大于10的个数(用二元组)
a.par.aggregate((10,0))(
(x,y)=>{
if(y>x._1){
println("seqop",x,y)
(x._1,x._2+1)
}else{
x
}
},
(x,y)=>{
println(x,y)
(x._1,x._2+y._2)
}
)
输出
((10,0),(10,0))
(seqop,(10,0),23)
(seqop,(10,0),16)
(seqop,(10,0),20)
(seqop,(10,0),21)
(seqop,(10,0),22)
(seqop,(10,0),19)
((10,0),(10,0))
(seqop,(10,0),11)
((10,0),(10,0))
(seqop,(10,0),13)
(seqop,(10,1),12)
(seqop,(10,0),15)
((10,0),(10,0))
((10,1),(10,1))
(seqop,(10,0),18)
(seqop,(10,0),24)
(seqop,(10,0),14)
(seqop,(10,0),17)
((10,1),(10,1))
((10,1),(10,1))
((10,1),(10,2))
((10,0),(10,0))
((10,0),(10,2))
((10,1),(10,2))
((10,1),(10,2))
((10,1),(10,1))
((10,3),(10,3))
((10,0),(10,2))
((10,1),(10,2))
((10,0),(10,2))
((10,3),(10,3))
((10,6),(10,6))
((10,2),(10,12))
res102: (Int, Int) = (10,14)
统计大于10和大于20的个数(用四元组)
a.par.aggregate((10,0,20,0))(
(x,y)=>{
println("seqop",x,y);
if(y>x._1&&y<=x._3){
(x._1,x._2+1,x._3,x._4)
}else if(y>x._3){
(x._1,x._2,x._3,x._4+1)
}else{
x
}
},
(x,y)=>{
println(x,y)
(x._1,x._2+y._2,x._3,x._4+y._4)
}
)
输出
(seqop,(10,0,20,0),1)
(seqop,(10,0,20,0),2)
(seqop,(10,0,20,0),8)
(seqop,(10,0,20,0),19)
(seqop,(10,0,20,0),20)
(seqop,(10,1,20,0),21)
((10,1,20,0),(10,1,20,1))
(seqop,(10,0,20,0),10)
(seqop,(10,0,20,0),7)
(seqop,(10,0,20,0),13)
(seqop,(10,0,20,0),6)
(seqop,(10,0,20,0),5)
((10,0,20,0),(10,0,20,0))
(seqop,(10,0,20,0),4)
(seqop,(10,0,20,0),24)
(seqop,(10,0,20,0),16)
(seqop,(10,0,20,0),14)
(seqop,(10,0,20,0),12)
(seqop,(10,0,20,0),23)
(seqop,(10,0,20,0),9)
(seqop,(10,0,20,0),11)
(seqop,(10,0,20,0),22)
(seqop,(10,0,20,0),3)
((10,1,20,0),(10,1,20,0))
((10,0,20,0),(10,0,20,0))
((10,0,20,1),(10,0,20,1))
((10,0,20,1),(10,0,20,2))
(seqop,(10,1,20,0),15)
((10,1,20,0),(10,2,20,0))
(seqop,(10,0,20,0),18)
(seqop,(10,0,20,0),17)
((10,0,20,0),(10,0,20,0))
((10,1,20,0),(10,1,20,0))
((10,2,20,1),(10,0,20,3))
((10,0,20,0),(10,0,20,0))
((10,0,20,0),(10,2,20,0))
((10,0,20,0),(10,0,20,0))
((10,0,20,0),(10,2,20,0))
((10,1,20,0),(10,2,20,0))
((10,0,20,0),(10,0,20,0))
((10,3,20,0),(10,3,20,0))
((10,0,20,0),(10,0,20,0))
((10,6,20,0),(10,2,20,4))
((10,0,20,0),(10,2,20,0))
((10,2,20,0),(10,8,20,4))
res99: (Int, Int, Int, Int) = (10,10,20,4)