webentwicklung-frage-antwort-db.com.de

Spark-Datenrahmen: collect () vs select ()

Wenn Sie collect() auf einer RDD aufrufen, wird das gesamte Dataset an den Treiber zurückgegeben, was zu viel Speicherplatz verursachen kann. Dies sollte vermieden werden.

Verhält sich collect() genauso, wenn es für ein Datenframe aufgerufen wird?
Was ist mit der select()-Methode?
Funktioniert es genauso wie collect(), wenn für ein Datenframe aufgerufen wird?

10
Mrinal

Aktionen vs. Transformationen

  • Collect (Aktion) - Gibt alle Elemente des Datensatzes als Array im Treiberprogramm zurück. Dies ist normalerweise nach einem Filter oder .__ nützlich. andere Operation, die eine ausreichend kleine Teilmenge der Daten zurückgibt.

spark-sql doc

select (* cols) (Umwandlung) - Projiziert eine Reihe von Ausdrücken und gibt einen neuen DataFrame zurück.

Parameter: cols - Liste der Spaltennamen (Zeichenfolge) oder Ausdrücke (Säule). Wenn einer der Spaltennamen "*" ist, wird diese Spalte erweitert Um alle Spalten in den aktuellen DataFrame aufzunehmen. **

df.select('*').collect()
[Row(age=2, name=u'Alice'), Row(age=5, name=u'Bob')]
df.select('name', 'age').collect()
[Row(name=u'Alice', age=2), Row(name=u'Bob', age=5)]
df.select(df.name, (df.age + 10).alias('age')).collect()
[Row(name=u'Alice', age=12), Row(name=u'Bob', age=15)]

Die Ausführungsmethode select(column-name1,column-name2,etc) für ein Datenframe gibt ein neues Datenframe zurück, das nur die Spalten enthält, die in der Funktion select() ausgewählt wurden.

z.B. Es wird angenommen, dass df mehrere Spalten enthält, darunter "Name" und "Wert" und einige andere.

df2 = df.select("name","value")

df2 enthält nur zwei Spalten ("Name" und "Wert") aus den gesamten Spalten von df.

df2 als Ergebnis von select wird in den Executoren und nicht im Treiber (wie im Fall der Verwendung von collect())

SQL-Programmierhandbuch

df.printSchema()
# root
# |-- age: long (nullable = true)
# |-- name: string (nullable = true)

# Select only the "name" column
df.select("name").show()
# +-------+
# |   name|
# +-------+
# |Michael|
# |   Andy|
# | Justin|
# +-------+

Sie können collect() auf einem Datenrahmen ausführen ( spark docs )

>>> l = [('Alice', 1)]
>>> spark.createDataFrame(l).collect()
[Row(_1=u'Alice', _2=1)]
>>> spark.createDataFrame(l, ['name', 'age']).collect()
[Row(name=u'Alice', age=1)]

spark docs

Um alle Elemente auf dem Treiber zu drucken, können Sie die collect () -Methode .__ verwenden. Um zuerst die RDD zum Treiberknoten zu bringen, gehen Sie folgendermaßen vor: rdd.collect (). foreach (println). Dies kann dazu führen, dass der Treiber zur Neige geht des Speichers jedoch, weil collect () die gesamte RDD in eine .__ abruft. Einzelmaschine; Wenn Sie nur wenige Elemente der RDD drucken müssen, eine Ein sicherer Ansatz ist die Verwendung von take (): rdd.take (100) .foreach (println).

20
Yaron

das Aufrufen von select führt zur lazy-Auswertung. Beispiel:

val df1 = df.select("col1")
val df2 = df1.filter("col1 == 3")

die beiden obigen Anweisungen enthalten den Lazy-Pfad, der ausgeführt wird, wenn Sie action für df aufrufen, wie show, collect usw.

val df3 = df2.collect()

verwenden Sie .explain am Ende Ihrer Transformation, um dessen Plan zu befolgen Ausführlichere Informationen Transformationen und Aktionen

3
Karol Sudol

Select wird zum Projizieren einiger oder aller Felder eines dataframe verwendet. Sie erhalten keine value als Ausgabe, sondern eine neue dataframe. Es ist eine transformation.

2
Rajat Mishra

Select ist eine Transformation, keine Aktion, daher wird sie träge ausgewertet (die Berechnungen werden nicht durchgeführt, sondern nur die Operationen abgebildet). Collect ist eine Aktion.

Versuchen:

df.limit(20).collect()

2
Jason