Spark: diferencia de semántica entre reduce y reduceByKey

En la documentación de Spark, dice que el método RDDreduce requiere una función binaria asociativa Y conmutativa.

Sin embargo, el métodoreduceByKey SOLO requiere una función binaria asociativa.

sc.textFile("file4kB", 4)

Hice algunas pruebas, y aparentemente es el comportamiento que obtengo. ¿Por qué esta diferencia? Por quereduceByKey asegúrese de que la función binaria se aplique siempre en cierto orden (para adaptarse a la falta de conmutatividad) cuandoreduce ¿no?

Ejemplo, si carga un texto (pequeño) con 4 particiones (mínimo):

val r = sc.textFile("file4k", 4)

entonces:

r.reduce(_ + _)

devuelve una cadena donde las partes no siempre están en el mismo orden, mientras que:

r.map(x => (1,x)).reduceByKey(_ + _).first

siempre devuelve la misma cadena (donde todo está en el mismo orden que en el archivo original).

(Lo verifiqué conr.glom y el contenido del archivo se extiende en 4 particiones, no hay una partición vacía).

Respuestas a la pregunta(2)

Su respuesta a la pregunta