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).