您知道 Spark RDD 执行分布式计算。
所以,这里的这一行,
val rdd1 = sc.parallelize(List(1,2,3,4,5), 3)
告诉 Spark 它需要在这个 RDD 中支持 3 个分区,这将使它能够使用 3 个独立的执行器并行运行计算。
现在,这条线在这里,
rdd1.fold(5)(_ + _)
告诉 spark 以 5 作为初始值折叠所有这些分区,然后以 5 作为初始值再次折叠来自 3 个执行器的所有这些分区结果。
一个普通的 Scala 等价物可以写成,
val list = List(1, 2, 3, 4, 5)
val listOfList = list.grouped(2).toList
val listOfFolds = listOfList.map(l => l.fold(5)(_ + _))
val fold = listOfFolds.fold(5)(_ + _)
所以...如果您在 RDD 上使用 fold,您需要提供 zero value。
但是你会问 - 为什么或何时有人会使用 fold 而不是 reduce?
您的困惑在于您对zero value 的看法。问题是,RDD[T] 的 zero value 并不完全取决于我们的类型 T,还取决于计算的性质。所以你的zero value 不需要是0。
让我们考虑一个简单的例子,我们要在 RDD 中计算 "largest number greater than 15" or "15",
我们可以使用reduce 做到这一点吗?答案是不。但是我们可以使用fold 来做到这一点。
val n15GT15 = rdd1.fold(15)({ case (acc, i) => Math.max(acc, i) })