Explicação do método de dobra do spark RDD
Estou executando o Spark-1.4.0 pré-criado para o Hadoop-2.4 (no modo local) para calcular a soma dos quadrados de um DoubleRDD. Meu código Scala parece
sc.parallelize(Array(2., 3.)).fold(0.0)((p, v) => p+v*v)
E deu um resultado surpreendente97.0
.
Isso é bastante contra-intuitivo em comparação com a versão Scala dofold
Array(2., 3.).fold(0.0)((p, v) => p+v*v)
o que dá a resposta esperada13.0
.
Parece bastante provável que cometi alguns erros complicados no código devido a uma falta de entendimento. Eu li sobre como a função usada noRDD.fold()
deve ser comunicativo, caso contrário, o resultado pode depender de partições e etc. Por exemplo, se eu alterar o número de partições para 1,
sc.parallelize(Array(2., 3.), 1).fold(0.0)((p, v) => p+v*v)
o código vai me dar169.0
na minha máquina!
Alguém pode explicar o que exatamente está acontecendo aqui?