2016-03-17 5 views
2

В чем разница между reduce и fold в отношении их технической реализации?reduce() vs. fold() в Apache Spark

Я понимаю, что они отличаются своей сигнатурой, поскольку fold принимает дополнительный параметр (то есть начальное значение), который добавляется к каждому выходу раздела.

  • Может ли кто-нибудь рассказать об использовании для этих двух действий?
  • Что будет лучше, если рассматривать сценарий 0 для fold?

Заранее спасибо.

+6

Я думаю, что это не зависит от искры, sonwill лучше читать другие ресурсы или вопросы http://stackoverflow.com/questions/25158780/difference-between-reduce-and-foldleft-fold-in-functional- programming-particula – anquegi

+0

@anquegi, разница, которая может быть распараллелена (что объясняется в ответе, на который вы ссылаетесь), имеет большое влияние на Spark. Это не имеет ничего общего с Hadoop, и это действительно дубликат этого вопроса. –

+0

@TheArchetypalPaul fold (не foldLeft/foldRight) может быть (и есть) также распараллеливаться. – zero323

ответ

4

Там нет практической разницы, когда речь идет о производительности вообще:

  • RDD.fold действие с помощью fold на перегородке Iterators который реализуется с помощью foldLeft.
  • RDD.reduce использует reduceLeft на перегородке Iterators.

Оба метода сохранить изменяемый аккумулятор и технологические разделы последовательно, используя простые петли с foldLeft implemented like this:

foreach (x => result = op(result, x)) 

и reduceLeft like this:

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

Практическая разница между этими методами в Спарке только связанный с их поведение в пустых коллекциях и возможность использования изменяемого буфера (возможно, это связано с производительностью). Вы найдете некоторые дискуссии в Why is the fold action necessary in Spark?

Кроме того нет никакой разницы в общей модели обработки:

  • Каждый раздел обрабатывается последовательно с использованием одного потока.
  • Перегородки обрабатываются параллельно с использованием нескольких потоков исполнителей/исполнителей.
  • Окончательное слияние выполняется последовательно, используя один поток на драйвере.