Was ist der Unterschied zwischen einem RDD map
und einer mapPartitions
Methode? Und verhält flatMap
sich wie map
oder wie mapPartitions
? Vielen Dank.
(bearbeiten) dh was ist der Unterschied (entweder semantisch oder in Bezug auf die Ausführung) zwischen
def map[A, B](rdd: RDD[A], fn: (A => B))
(implicit a: Manifest[A], b: Manifest[B]): RDD[B] = {
rdd.mapPartitions({ iter: Iterator[A] => for (i <- iter) yield fn(i) },
preservesPartitioning = true)
}
Und:
def map[A, B](rdd: RDD[A], fn: (A => B))
(implicit a: Manifest[A], b: Manifest[B]): RDD[B] = {
rdd.map(fn)
}
performance
scala
apache-spark
rdd
Nicholas White
quelle
quelle
Antworten:
Das Verfahren Karte wandelt jedes Element der Quelle RDD in ein einzelnes Element des Ergebnisses RDD durch eine Funktion der Anwendung. mapPartitions konvertiert jede Partition der Quell-RDD in mehrere Elemente des Ergebnisses (möglicherweise keine).
Weder, flatMap arbeitet auf einem einzigen Element (wie
map
) und erzeugt mehrere Elemente des Ergebnisses (wiemapPartitions
).quelle
map
undflatMap
haben genau die gleichen Partitionen als Mutter.map
Im Grunde genommen übernimmt Ihre Funktionf
und gibt sie weiteriter.map(f)
. Im Grunde ist es eine bequeme Methode, die einschließtmapPartitions
. Es würde mich wundern, wenn es einen Leistungsvorteil für einen reinen Map-Style-Transformationsjob geben würde (dh wenn die Funktion identisch ist). Wenn Sie einige Objekte für die Verarbeitung erstellen müssen und diese Objekte gemeinsam genutzt werden können,mapPartitions
wäre dies von Vorteil.Imp. TRINKGELD :
Ja. Bitte sehen Sie Beispiel 2 von
flatmap
.. es ist selbsterklärend.Beispielszenario : Wenn eine bestimmte
RDD
Partition100.000 Elemente enthält, wird die von der Zuordnungstransformation verwendete Funktion bei Verwendung 100.000 Mal ausgelöstmap
.Wenn wir umgekehrt verwenden,
mapPartitions
rufen wir die jeweilige Funktion nur einmal auf, übergeben jedoch alle 100.000 Datensätze und erhalten alle Antworten in einem Funktionsaufruf zurück.Es wird einen Leistungsgewinn geben, da die
map
Arbeit an einer bestimmten Funktion so oft ausgeführt wird, insbesondere wenn die Funktion jedes Mal etwas Teueres tut, das nicht erforderlich wäre, wenn wir alle Elemente gleichzeitig übergeben würden (im Fall vonmappartitions
).Karte
Beispiel:
mapPartitions
Beispiel 1
Beispiel 2
Das obige Programm kann auch wie folgt mit flatMap geschrieben werden.
Beispiel 2 mit Flatmap
Fazit :
mapPartitions
Die Transformation ist schneller alsmap
da sie Ihre Funktion einmal / Partition aufruft, nicht einmal / Element.Weiterführende Literatur: foreach Vs foreachPartitions Wann was verwenden?
quelle
map
odermapPartitions
erzielen können (siehe die beiden Beispiele in der Frage). In dieser Frage geht es darum, warum Sie einen Weg über den anderen wählen. Die Kommentare in der anderen Antwort sind wirklich nützlich! Außerdem haben Sie das nicht erwähntmap
undflatMap
gehenfalse
zupreservesPartitioning
und was die Auswirkungen davon sind.map
es besser ist alsmapPartitions
? WennmapPartitions
es so gut ist, warum ist es nicht die Standardimplementierung der Karte?Karte :
MapPartitions
quelle