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

时间:2016-06-28 15:05:13

标签: 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

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

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

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

1 个答案:

答案 0 :(得分:5)

  

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

他们不是两个参数,他们是Tuple2

input.aggregate((0, 0))

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

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

def aggregate[U](zeroValue: U)(seqOp: (U, T) ⇒ U, combOp: (U, U) ⇒ U)
                (implicit arg0: ClassTag[U]): U