澄清火花聚集功能

时间:2019-11-08 03:56:24

标签: scala apache-spark

我是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)概念。

1 个答案:

答案 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),然后使用第一个函数将元素在每个分区中一起归约。然后使用第二个函数减少每个分区的最终结果。