有人可以用两个初始值来解释这个scala聚合函数

Sal*_*Sal 1 scala apache-spark

我是Scala的新手,我试图在spark中解决这个问题,它也使用Scala在RDD上执行操作.

到目前为止,我只看到只有一个初始值的聚合函数(i,e some-input.aggregate(Initial-value)((acc,value)=>(acc+value))),但是这个程序有两个初始值(0,0).

根据我的理解,该程序用于计算运行平均值并记录到目前为止的计数.

val result = input.aggregate((0, 0))(
               (acc, value) => (acc._1 + value, acc._2 + 1),
               (acc1, acc2) => (acc1._1 + acc2._1, acc1._2 + acc2._2))
val avg = result._1 / result._2.toDouble
Run Code Online (Sandbox Code Playgroud)

我知道在foldLeft/ aggregate我们提供初始值,因此在空集合的情况下,我们得到默认值,并且都有累加器和值部分.

但在这种情况下,我们有两个初始值,累加器正在访问元组值.这个元组在哪里定义

有人可以逐行解释整个程序.

Yuv*_*kov 5

但是这个程序有两个初始值(0,0).

它们不是两个参数,它们是一个Tuple2:

input.aggregate((0, 0))
Run Code Online (Sandbox Code Playgroud)

传递给aggregate它的值被附加的圆括号(( ))括起来,它们被用作语法糖Tuple2.apply.这就是你看到元组来自的地方.

如果您查看方法定义(我假设这是RDD.aggregate),您将看到它在第一个参数列表中需要一个参数:

def aggregate[U](zeroValue: U)(seqOp: (U, T) ? U, combOp: (U, U) ? U)
                (implicit arg0: ClassTag[U]): U
Run Code Online (Sandbox Code Playgroud)