Spark: разница семантики между Reduce и ReduceByKey
В документации Spark говорится, что метод RDDsreduce
требует ассоциативной и коммутативной двоичной функции.
Однако метод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 разделам, пустых разделов нет).