Там нет практической разницы, когда речь идет о производительности вообще:
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?
Кроме того нет никакой разницы в общей модели обработки:
- Каждый раздел обрабатывается последовательно с использованием одного потока.
- Перегородки обрабатываются параллельно с использованием нескольких потоков исполнителей/исполнителей.
- Окончательное слияние выполняется последовательно, используя один поток на драйвере.
Я думаю, что это не зависит от искры, sonwill лучше читать другие ресурсы или вопросы http://stackoverflow.com/questions/25158780/difference-between-reduce-and-foldleft-fold-in-functional- programming-particula – anquegi
@anquegi, разница, которая может быть распараллелена (что объясняется в ответе, на который вы ссылаетесь), имеет большое влияние на Spark. Это не имеет ничего общего с Hadoop, и это действительно дубликат этого вопроса. –
@TheArchetypalPaul fold (не foldLeft/foldRight) может быть (и есть) также распараллеливаться. – zero323