Spark: diferença de semântica entre reduzir e reduzirByKey

Na documentação do Spark, diz que o método RDDsreduce requer uma função binária associativa e comutativa.

No entanto, o métodoreduceByKey SOMENTE requer uma função binária associativa.

sc.textFile("file4kB", 4)

Fiz alguns testes e, aparentemente, é o comportamento que recebo. Por que essa diferença? PorquereduceByKey garantir que a função binária seja sempre aplicada em certa ordem (para acomodar a falta de comutatividade) quandoreduce não?

Exemplo, se você carregar algum texto (pequeno) com 4 partições (mínimo):

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

então:

r.reduce(_ + _)

retorna uma string em que as peças nem sempre estão na mesma ordem, enquanto:

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

sempre retorna a mesma sequência (onde tudo está na mesma ordem que no arquivo original).

(Verifiquei comr.glom e o conteúdo do arquivo está realmente distribuído em 4 partições, não há partição vazia).

questionAnswers(2)

yourAnswerToTheQuestion