就技术实现而言,reducefold有什么区别?

我知道它们的签名有所不同,因为fold接受附加参数(即初始值),该参数会添加到每个分区输出中。

  • 有人可以告知这两个操作的用例吗?
  • fold中使用0的情况下,哪个会表现更好?

  • 提前致谢。

    最佳答案

    在性能方面,没有任何实际差异:

  • RDD.fold操作在分区fold上使用Iterators,分区foldLeft是使用RDD.reduce实现的。
  • reduceLeft在分区Iterators上使用foldLeft

  • 两种方法都使用带有 reduceLeft implemented like this的简单循环来保持可变的累加器和顺序处理分区:
    foreach (x => result = op(result, x))
    

    ojit_code like this:
    for (x <- self) {
      if (first) {
        ...
      }
      else acc = op(acc, x)
    }
    

    这些方法在Spark中的实际区别仅与它们在空集合上的行为以及使用可变缓冲区的能力有关(可以说,这与性能有关)。您会在Why is the fold action necessary in Spark?中找到一些讨论

    此外,整体处理模型没有任何区别:
  • 每个分区使用单个线程顺序处理。
  • 使用多个执行程序/执行程序线程并行处理分区。
  • 使用驱动程序上的单个线程按顺序执行最终合并。
  • 关于scala - Apache Spark中的reduce()与fold(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36056895/

    10-12 18:57