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