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我们提供初始值,因此在空集合的情况下,我们得到默认值,并且都有累加器和值部分.
但在这种情况下,我们有两个初始值,累加器正在访问元组值.这个元组在哪里定义?
有人可以逐行解释整个程序.
但是这个程序有两个初始值(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)