Пояснение метода складывания искры RDD
Я запускаю Spark-1.4.0, предварительно созданную для Hadoop-2.4 (в локальном режиме), чтобы вычислить сумму квадратов DoubleRDD. Мой код Scala выглядит так
sc.parallelize(Array(2., 3.)).fold(0.0)((p, v) => p+v*v)
И это дало удивительный результат97.0
.
Это довольно нелогично по сравнению с версией Scalafold
Array(2., 3.).fold(0.0)((p, v) => p+v*v)
который дает ожидаемый ответ13.0
.
Кажется вполне вероятным, что я допустил некоторые хитрые ошибки в коде из-за недостатка понимания. Я читал о том, как функция используется вRDD.fold()
должен быть коммуникативным, в противном случае результат может зависеть от разделов и т. д. Так, например, если я изменю количество разделов на 1,
sc.parallelize(Array(2., 3.), 1).fold(0.0)((p, v) => p+v*v)
код даст мне169.0
на моей машине!
Может кто-нибудь объяснить, что именно здесь происходит?