Es hängt davon ab, was Sie meinen, wenn Sie über RDD
sprechen. Streng genommen ist nur eine Beschreibung der Abstammung, die nur für den Treiber existiert und keine Methoden bereitstellt, die verwendet werden können, um ihre Abstammung zu verändern.
Wenn Daten verarbeitet werden, können wir nicht mehr über RDDs sprechen, aber dennoch werden Daten mit unveränderlichen Datenstrukturen (scala.collection.Iterator
in Scala, itertools.chain
in Python) verfügbar gemacht.
So weit so gut. Leider bedeutet die Unveränderbarkeit einer Datenstruktur keine Unveränderlichkeit der gespeicherten Daten. Läßt ein kleines Beispiel erstellen, das zu veranschaulichen:
val rdd = sc.parallelize(Array(0) :: Array(0) :: Array(0) :: Nil)
rdd.map(a => { a(0) +=1; a.head }).sum
// Double = 3.0
Sie können dies so oft ausführen, wie Sie das gleiche Ergebnis wollen und erhalten. Nun läßt cache
rdd
und wiederholen Sie einen gesamten Prozess:
rdd.cache
rdd.map(a => { a(0) +=1; a.head }).sum
// Double = 3.0
rdd.map(a => { a(0) +=1; a.head }).sum
// Double = 6.0
rdd.map(a => { a(0) +=1; a.head }).sum
// Double = 9.0
Seit Funktion, die wir in den ersten map
verwenden nicht rein und modifiziert sein wandelbares Argument anstelle diesen Änderungen werden bei jeder Ausführung akkumuliert und in unvorhersehbarem Ausgang führen. Wenn zum Beispiel rdd
aus dem Cache entfernt wird, können wir wieder 3.0 bekommen. Wenn einige Partitionen nicht zwischengespeichert sind, können Sie Ergebnisse mischen.
PySpark bietet eine stärkere Isolierung und die Erzielung von Ergebnissen wie dies ist nicht möglich, aber es ist eine Frage der Architektur nicht eine Unveränderlichkeit.
Die Nachricht zum Wegnehmen ist, dass Sie bei der Arbeit mit veränderlichen Daten äußerst vorsichtig sein und jegliche Änderungen vermeiden sollten, sofern dies nicht ausdrücklich erlaubt ist (fold
, aggregate
).
Nein, es wird nie versagen! Wenn die zugrunde liegende Infrastruktur unveränderlich ist, wie möchten Sie, dass sie die Unveränderlichkeit nicht erfüllt? – eliasah
Ja, ich stimme zu, dass die Struktur unveränderlich ist. Ich habe nur versucht zu überprüfen, ob es einen Fall gibt. Es ist auch resilient und fehlertolerant, was es erlaubt, Fehler neu zu berechnen. Stellt re-Berechnung auch die Unveränderlichkeit sicher? Denken Sie daran, in streaming Windows arbeiten und erstellen Sie eine dstream, das ist ein Paket von RDDs und implizieren das Scheitern und Neuberechnung, und garantiert es Unveränderlichkeit.? – Srini