Kann mir jemand den Unterschied zwischen Map und FlatMap erklären und was ist ein guter Anwendungsfall für jeden?
Was bedeutet "Ergebnisse reduzieren"? Wozu ist es gut?
apache-spark
Eran Witkon
quelle
quelle
RDD.map
undRDD.flatMap
in Apache Spark fragen . Im Allgemeinen werden die RDD-Operationen von Spark nach den entsprechenden Scala-Erfassungsoperationen modelliert. Die Antworten in stackoverflow.com/q/1059776/590203 , in denen die Unterscheidung zwischenmap
undflatMap
in Scala erläutert wird , können für Sie hilfreich sein.Antworten:
Hier ist ein Beispiel für den Unterschied als
spark-shell
Sitzung:Zunächst einige Daten - zwei Textzeilen:
Nun
map
wandelt eine RDD der Länge N in einer anderen RDD der Länge NBeispielsweise werden zwei Zeilen in zwei Zeilenlängen abgebildet:
Aber
flatMap
(lose gesagt) transformiert eine RDD der Länge N in eine Sammlung von N Sammlungen und glättet diese dann in eine einzelne RDD von Ergebnissen.Wir haben mehrere Wörter pro Zeile und mehrere Zeilen, aber am Ende haben wir ein einziges Ausgabearray von Wörtern
Um dies zu veranschaulichen, sieht flatMapping von einer Sammlung von Zeilen zu einer Sammlung von Wörtern folgendermaßen aus:
Die Eingangs- und Ausgangs-RDDs haben daher typischerweise unterschiedliche Größen für
flatMap
.Wenn wir versucht hätten,
map
mit unserersplit
Funktion zu arbeiten, hätten wir verschachtelte Strukturen erhalten (eine RDD von Arrays von Wörtern mit TypRDD[Array[String]]
), weil wir genau ein Ergebnis pro Eingabe haben müssen:Ein nützlicher Sonderfall ist schließlich die Zuordnung zu einer Funktion, die möglicherweise keine Antwort zurückgibt und daher eine zurückgibt
Option
. Wir können verwendenflatMap
, um die Elemente herauszufiltern, die zurückgeben,None
und die Werte aus denen zu extrahieren, die a zurückgebenSome
:(Beachten Sie hier, dass sich eine Option eher wie eine Liste verhält, die entweder ein Element oder null Elemente enthält.)
quelle
["a b c", "", "d"] => [["a","b","c"],[],["d"]]
?split
über eine Liste von Strings eine Liste von Arrays erstellt)Im Allgemeinen verwenden wir ein Beispiel für die Wortanzahl in hadoop. Ich werde den gleichen Anwendungsfall nehmen und verwenden
map
undflatMap
und wir werden den Unterschied sehen, wie es die Daten verarbeitet.Unten finden Sie die Beispieldatendatei.
Die obige Datei wird mit
map
und analysiertflatMap
.Verwenden von
map
Die Eingabe hat 4 Zeilen und die Ausgabegröße beträgt ebenfalls 4, dh N Elemente ==> N Elemente.
Verwenden von
flatMap
Die Ausgabe unterscheidet sich von der Karte.
Weisen wir jedem Schlüssel 1 als Wert zu, um die Wortanzahl zu erhalten.
fm
: RDD erstellt mitflatMap
wc
: RDD erstellt mitmap
Während
flatMap
auf RDDwc
die folgende unerwünschte Ausgabe liefert:Sie können die Wortanzahl nicht erhalten, wenn
map
anstelle von verwendet wirdflatMap
.Gemäß der Definition ist der Unterschied zwischen
map
undflatMap
:quelle
.map(lambda line:line.split(" "))
ist kein Array von Zeichenfolgen. Sie sollten änderndata.collect()
zuwc.collect
und Sie werden ein Array von Arrays sehen.wc.collect()
?Wenn Sie in Spark nach dem Unterschied zwischen RDD.map und RDD.flatMap fragen, transformiert map eine RDD der Größe N in eine andere der Größe N. z.B.
Zum Beispiel, wenn myRDD aus Doubles besteht.
Während flatMap das RDD in ein anderes mit einer anderen Größe umwandeln kann: z.
Dies gibt eine RDD der Größe 2 * N oder zurück
quelle
Es läuft auf Ihre erste Frage hinaus: Was meinen Sie mit Abflachen ?
quelle
Verwenden Sie
test.md
als Beispiel:Wenn Sie
map
method verwenden, erhalten Sie die Zeilentest.md
, fürflatMap
method erhalten Sie die Anzahl der Wörter.Die
map
Methode ist ähnlichflatMap
, sie geben alle eine neue RDD zurück.map
Methode häufig zur Verwendung einer neuen RDD zurückgeben,flatMap
Methode häufig zur Verwendung von geteilten Wörtern.quelle
map
Gibt RDD mit der gleichen Anzahl von Elementen zurück, obwohl diesflatMap
möglicherweise nicht der Fall ist .Ein Anwendungsbeispiel für das
flatMap
Herausfiltern fehlender oder falscher Daten.Ein Anwendungsbeispiel für die
map
Verwendung in einer Vielzahl von Fällen, in denen die Anzahl der Eingabe- und Ausgabeelemente gleich ist.number.csv
map.py fügt alle Zahlen in add.csv hinzu.
flatMap.py wird verwendet
flatMap
, um fehlende Daten vor dem Hinzufügen herauszufiltern. Im Vergleich zur vorherigen Version werden weniger Zahlen hinzugefügt.quelle
map und flatMap sind insofern ähnlich, als sie eine Linie von der Eingabe-RDD nehmen und eine Funktion darauf anwenden. Sie unterscheiden sich darin, dass die Funktion in map nur ein Element zurückgibt, während die Funktion in flatMap eine Liste von Elementen (0 oder mehr) als Iterator zurückgeben kann.
Außerdem wird die Ausgabe der flatMap abgeflacht. Obwohl die Funktion in flatMap eine Liste von Elementen zurückgibt, gibt die flatMap eine RDD zurück, die alle Elemente aus der Liste auf flache Weise enthält (keine Liste).
quelle
Alle Beispiele sind gut ... Hier ist eine schöne visuelle Illustration ... Quelle mit freundlicher Genehmigung: DataFlair Training of Spark
Karte: Eine Karte ist eine Transformationsoperation in Apache Spark. Es gilt für jedes Element von RDD und gibt das Ergebnis als neues RDD zurück. In der Map kann der Operationsentwickler seine eigene benutzerdefinierte Geschäftslogik definieren. Die gleiche Logik wird auf alle Elemente von RDD angewendet.
Die Spark-RDD-
map
Funktion verwendet ein Element als Eingabeprozess gemäß dem vom Entwickler angegebenen benutzerdefinierten Code und gibt jeweils ein Element zurück. Map transformiert eine RDD der Länge N in eine andere RDD der Länge N. Die Eingabe- und Ausgabe-RDDs haben normalerweise die gleiche Anzahl von Datensätzen.Beispiel für die
map
Verwendung von Scala:FlatMap:
A
flatMap
ist eine Transformationsoperation. Es gilt für jedes Element von RDD und gibt das Ergebnis als neu zurückRDD
. Es ähnelt Map, aber FlatMap ermöglicht die Rückgabe von 0, 1 oder mehr Elementen aus der Map-Funktion. In der FlatMap-Operation kann ein Entwickler seine eigene benutzerdefinierte Geschäftslogik definieren. Die gleiche Logik wird auf alle Elemente der RDD angewendet.Eine FlatMap-Funktion verwendet ein Element als Eingabeprozess gemäß dem vom Entwickler angegebenen benutzerdefinierten Code und gibt jeweils 0 oder mehr Elemente zurück.
flatMap
() transformiert eine RDD der Länge N in eine andere RDD der Länge M.Beispiel für die
flatMap
Verwendung von Scala:quelle
Der Unterschied ist aus dem folgenden Beispiel-Pyspark-Code ersichtlich:
quelle
Flatmap und Map transformieren beide die Sammlung.
Unterschied:
map (func)
Gibt einen neuen verteilten Datensatz zurück, der durch Übergeben jedes Elements der Quelle durch eine Funktionsfunktion gebildet wird.
flatMap (func)
Ähnlich wie map, aber jedes Eingabeelement kann 0 oder mehr Ausgabeelementen zugeordnet werden (daher sollte func eine Seq anstelle eines einzelnen Elements zurückgeben).
Die Transformationsfunktion:
map : Ein Element rein -> ein Element raus.
flatMap : Ein Element in -> 0 oder mehr Elemente out (eine Sammlung).
quelle
RDD.map
Gibt alle Elemente in einem Array zurückRDD.flatMap
Gibt Elemente in Arrays des Arrays zurückNehmen wir an, wir haben Text in der Datei text.txt als
Karte verwenden
Ausgabe:
FlatMap verwenden
Ausgabe:
quelle
Für alle, die PySpark im Zusammenhang haben wollten:
Beispieltransformation: flatMap
['Hallo, was machst du']
Traceback (letzter Aufruf zuletzt): Datei "", Zeile 1, in AttributeError: Das Objekt 'list' hat kein Attribut 'split'.
[['Hallo', 'Was', 'Sind', 'Du', 'Tun'], ['Dies', 'Ist', 'Rak']]
['Hallo', 'Was', 'Sind', 'Du', 'Tun', 'Dies', 'Ist', 'Rak']
Ich hoffe es hilft :)
quelle
map
: Es wird eine neue zurückgegeben,RDD
indem auf jedes Element der eine Funktion angewendet wirdRDD
. Die Funktion in .map kann nur ein Element zurückgeben.flatMap
: Ähnlich wie bei der Karte, gibt es eine neueRDD
durch eine Funktion zu jedem Element der RDD Anwendung, aber die Ausgangs abgeflacht ist.Außerdem kann function in
flatMap
eine Liste von Elementen zurückgeben (0 oder mehr).Beispielsweise:
Quelle: https://www.linkedin.com/pulse/difference-between-map-flatmap-transformations-spark-pyspark-pandey/
quelle
Karte :
ist eine Methode höherer Ordnung, die eine Funktion als Eingabe verwendet und auf jedes Element in der Quell-RDD anwendet.
http://commandstech.com/difference-between-map-and-flatmap-in-spark-what-is-map-and-flatmap-with-examples/
flatMap:
eine Methode höherer Ordnung und eine Transformationsoperation, die eine Eingabefunktion übernimmt.
quelle
Unterschied in der Ausgabe von Map und FlatMap:
1.
flatMap
Ausgabe:
2 .
map
:Ausgabe:
quelle
während
quelle