在Scala中如何使用聚合?

在Scala中如何使用聚合?,scala,Scala,我一直在读一本spark的书,这个例子来自于这本书 input = List(1,2,3,4,5,6) 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 我试图了解它是如何工

我一直在读一本spark的书,这个例子来自于这本书

input = List(1,2,3,4,5,6)
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
我试图了解它是如何工作的,以及每一步的_1和_2是什么

(0,0)是种子值或初始值 此列表分为sep rdd 假设rdd1包含列表(1,2) 循环浏览此列表

(acc,值)
acc=???在循环的每次迭代中 值=???在循环的每次迭代中

(附件,数值)=>(附件1+数值,附件2+1) 在列表(1,2)的第一次迭代中,acc._1和_2的值是多少

(acc1,acc2)=>(acc1.\u1+acc2.\u1,acc1.\u2+acc2.\u2)) acc1(表示1,2)类似于3,2,acc2(表示3,4)是7,2 这个函数加上3+7和2+2=10,4,然后把这个值加到下一组中

亲爱的好心助手们:

请不要使用scala中使用的行话,我已经读过了,不理解,因此来寻求帮助


对于列表(1,2),在列表的第一次迭代期间,acc.\u 1和acc.\u 2的值是什么?在该迭代期间,“value”的值是什么?在第二次迭代期间,它们的值是什么?

aggregate
通过采用两个函数工作,组合分区内的值的一个和组合分区的一个

第一个函数(用于单个分区的函数)可以更清楚地写成

((sum, count), value) => (sum + value, count + 1)
((partition1Sum, partition1Count), (partition2Sum, partition2Count)) =>
    (partition1Sum + partition2Sum, partition1Count + partition2Count)
第二个函数(合并分区)可以写成

((sum, count), value) => (sum + value, count + 1)
((partition1Sum, partition1Count), (partition2Sum, partition2Count)) =>
    (partition1Sum + partition2Sum, partition1Count + partition2Count)

关于元组表示法的注释:


在Scala
(a,b,c)中,1==a
(a,b,c)中,2==b
等等
\n
给出元组的第n个元素。

聚合函数的第一个参数取一个初始值,在本例中是元组
(0,0)
,然后下一个参数是
seqop
,它是一个函数
(B,a)=>a
,在您的示例中它将
(tuple,Int)=>tuple

这里发生的是,这个函数一个接一个地应用于列表的每个参数。元组实际上在左侧保存列表的总和,在右侧保存到目前为止传递的列表的数量。聚合函数的结果是
(21,6)

附带说明:Scala中的
TraversableOnce
的实现实际上没有使用
combop
参数,在本例中,该参数是
(acc1,acc2)=>(acc1.\u 1+acc2.\u 1,acc1.\u 2+acc2.\u 2))
,因此在本例中可以忽略它。如果您熟悉Scala,执行的代码是:

input.foldLeft((0, 0))((acc, value) => (acc._1 + value, acc._2 + 1))
旁白:这是一个密切相关的问题。