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