Я запускаю Spark-1.4.0, предварительно созданный для Hadoop-2.4 (в локальном режиме), чтобы вычислить сумму квадратов DoubleRDD. Мой код Scala выглядит так
sc.parallelize(Array(2., 3.)).fold(0.0)((p, v) => p+v*v)
И это дало удивительный результат 97.0
.
Это довольно нелогично по сравнению с версией fold
для Scala.
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
на моей машине!
Может кто-нибудь объяснить, что именно здесь происходит?