我是Scala和Spark的新手。我不知道聚合函数。我收到了以下代码,但不了解输出值。
val z = sc.parallelize(List("12","23","345","4567"),2)
z.aggregate("")((x,y) => math.min(x.length, y.length).toString, (x,y) => x + y)
res5: String = 11
有2个分区。提供的初始值为“”。我不太确定如何应用值(x,y)。但是我的理解是,对于第一个分区,它将迭代地将它们取为(“”,“ 12”)(“ 12”,“ 23”),并且为第一个分区返回的最小值为0。对于第二个分区,类似分区(x,y)从(“”,“ 345”)(“ 345”,“ 4567”)迭代计算min函数,并且第二个分区返回的min值为0。
reducer函数从那里接管聚合结果“” +“ 0” +“ 0”-最终输出应为“ 00”,但实际输出为“ 11”
我缺少什么,有人可以解释上面的代码的聚合函数如何工作。特别是,我没有(x,y)概念。
答案 0 :(得分:0)
您可以通过添加一些日志记录来查看正在发生的情况:
z.aggregate("")((x,y) => {
val res = math.min(x.length, y.length).toString
println(s"math.min($x.length, $y.length).toString => $res")
res
}, (x,y) => {
println(s"$x + $y => ${x+y}")
x + y
})
哪个给:
math.min(.length, 345.length).toString => 0
math.min(.length, 12.length).toString => 0
math.min(0.length, 4567.length).toString => 1
math.min(0.length, 23.length).toString => 1
+ 1 => 1
1 + 1 => 11
使用分配给聚合函数的零元素映射每个分区中的第一个值(以获取新类型的第一个值,这里也是String),然后使用第一个函数将元素在每个分区中一起归约。然后使用第二个函数减少每个分区的最终结果。