Spark:聚合与映射和减少

Sor*_*scu 6 mapreduce apache-spark

我正在学习 Spark 并开始了解 Spark 如何分发数据并组合结果。我得出的结论是,使用 operation map后跟reduce比只使用 operation聚合有优势。这是(至少我相信如此)因为聚合使用顺序操作,这会损害并行性,而mapreduce可以从完全并行性中受益。因此,当有选择时,使用 map 和 reduce 不是比使用聚合更好吗?是否存在首选聚合的情况?或者当聚合不能被组合映射减少替换时?

例如 - 我想找到最大长度的字符串:

val z = sc.parallelize(List("123","12","345","4567"))
// instead of this aggregate ....
z.aggregate(0)((x, y) => math.max(x, y.length), (x, y) => math.max(x, y))
// .... shouldn't I rather use this map - reduce combination ?
z.map(_.length).reduce((x, y) => math.max(x, y))
Run Code Online (Sandbox Code Playgroud)

Sor*_*scu 0

我相信我可以部分回答我自己的问题。我错误地认为,由于使用了顺序操作,聚合可能会因其并行性而受到损害。数据仍然可以并行化,并且顺序操作将在每个块上执行。这似乎并不比地图操作性能差。那么剩下的问题是:为什么要使用聚合而不是Map-Reduce组合?