我是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正在访问元组值。 这个元组在哪里定义?
有人可以逐行解释整个程序。
答案 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