2016-11-04 3 views
1

Ich fand, dass Funken RDD.fold und scala List.fold mit derselben Eingabe unterschiedlich verhalten.Ist spark RDD.fold Methode Buggy?

Scala 2.11.8

List(1, 2, 3, 4).fold(1)(_ + _) // res0: Int = 11 

Ich denke, die korrekte Ausgabe ist da 1 + (1 + 2 + 3 + 4) gleich 11. Aber entfachen RDD.fold Buggy sieht.

Spark-2.0.1 (nicht geclusterten)

sc.parallelize(List(1, 2, 3, 4)).fold(1)(_ + _) // res0: Int = 15 

Obwohl RDD ist keine einfache Sammlung, ist dieses Ergebnis nicht sinnvoll. Ist das ein bekannter Fehler oder ein normales Ergebnis?

+0

@ Shankar danke! Ich hätte mehr vor dieser Frage suchen sollen ... – jyshin

Antwort

4

Es ist nicht fehlerhaft, Sie verwenden nur nicht auf die richtige Weise. zeroElement sollte neutral sein, bedeutet dies, dass es folgende Bedingung zu erfüllen hat:

op(x, zeroValue) === op(zeroValue, x) === x 

Wenn op ist + dann die richtige Wahl 0.

Warum Einschränkung wie ist das? Wenn fold parallel ausgeführt werden soll, muss jeder Chunk seine eigene zeroValue initialisieren. In einer formalen Art und Weise kann man darüber nachdenken, Monoid wo:

  • op entspricht: • (dies eine Vereinfachung ist in der Praxis op in Spark-kommutativ sein sollte, nicht nur assoziativ).
  • zeroElement entspricht dem Identitätselement.