Explicación del método de plegado de la chispa RDD
Estoy ejecutando Spark-1.4.0 preconstruido para Hadoop-2.4 (en modo local) para calcular la suma de cuadrados de un DoubleRDD. Mi código Scala parece
sc.parallelize(Array(2., 3.)).fold(0.0)((p, v) => p+v*v)
Y dio un resultado sorprendente97.0
.
Esto es bastante contra-intuitivo en comparación con la versión Scala defold
Array(2., 3.).fold(0.0)((p, v) => p+v*v)
que da la respuesta esperada13.0
.
Parece bastante probable que haya cometido algunos errores difíciles en el código debido a la falta de comprensión. He leído sobre cómo se usa la función enRDD.fold()
debe ser comunicativo; de lo contrario, el resultado puede depender de particiones, etc. Por ejemplo, si cambio el número de particiones a 1,
sc.parallelize(Array(2., 3.), 1).fold(0.0)((p, v) => p+v*v)
el código me dará169.0
en mi maquina!
¿Alguien puede explicar qué está sucediendo exactamente aquí?