В документации Spark говорится, что метод RDD reduce
требует ассоциативной и коммутативной двоичной функции.
Однако метод reduceByKey
ТОЛЬКО требует ассоциативной двоичной функции.
sc.textFile("file4kB", 4)
Я сделал несколько тестов, и, видимо, это поведение, которое я получаю. Почему это различие? Почему reduceByKey
гарантирует, что двоичная функция всегда применяется в определенном порядке (для обеспечения отсутствия коммутативности), если reduce
не работает?
Пример, если нагрузка немного (маленького) текста с 4 разделами (минимум):
val r = sc.textFile("file4k", 4)
то
r.reduce(_ + _)
возвращает строку, где части не всегда находятся в одном порядке, тогда как:
r.map(x => (1,x)).reduceByKey(_ + _).first
всегда возвращает ту же строку (где все находится в том же порядке, что и в исходном файле).
(я проверил с r.glom
, и содержимое файла действительно распространяется на 4 раздела, нет пустого раздела).