Mit Spark 2.x und Scala 2.11
Ich würde mir 3 Möglichkeiten vorstellen, um Werte einer bestimmten Spalte in List umzuwandeln.
Gemeinsame Codefragmente für alle Ansätze
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder.getOrCreate
import spark.implicits._
val df = Seq(
("first", 2.0),
("test", 1.5),
("choose", 8.0)
).toDF("id", "val")
Ansatz 1
df.select("id").collect().map(_(0)).toList
Was passiert jetzt? Wir sammeln Daten für den Treiber mit collect()
und wählen aus jedem Datensatz das Element Null aus.
Dies könnte keine hervorragende Möglichkeit sein. Verbessern wir es mit dem nächsten Ansatz.
Ansatz 2
df.select("id").rdd.map(r => r(0)).collect.toList
Wie ist es besser Wir haben die Last der Kartentransformation auf die Worker verteilt und nicht auf einen einzelnen Treiber.
Ich weiß, rdd.map(r => r(0))
scheint dir nicht elegant zu sein. Lassen Sie uns dies im nächsten Ansatz ansprechen.
Ansatz 3
df.select("id").map(r => r.getString(0)).collect.toList
Hier konvertieren wir DataFrame nicht in RDD. Schauen Sie sich an, dass map
dies aufgrund von Encoderproblemen in DataFrame nicht als vorheriger Ansatz akzeptiert r => r(0)
(oder _(0)
) wird. Verwenden r => r.getString(0)
Sie also am Ende und es wird in den nächsten Versionen von Spark behandelt.
Fazit
Alle Optionen liefern die gleiche Ausgabe, aber 2 und 3 sind effektiv, schließlich ist die dritte effektiv und elegant (würde ich denken).
Databricks Notizbuch