scala - read - Extrahieren Sie die Spaltenwerte von Dataframe als Liste in Apache Spark




spark sql example (4)

Mit Spark 2.x und Scala 2.11

Ich würde mir 3 Möglichkeiten überlegen, um Werte einer bestimmten Spalte in eine Liste umzuwandeln

Gemeinsame Code-Schnipsel für alle Ansätze

import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder.getOrCreate    
import spark.implicits._ // for .toDf() method

val df = Seq(
    ("first", 2.0),
    ("test", 1.5),
    ("choose", 8.0)
  ).toDF("id", "val")

Ansatz 1

df.select("id").collect().map(_(0)).toList
// res9: List[Any] = List(one, two, three)

Was passiert jetzt? Wir sammeln Daten an Driver mit collect() und wählen aus jedem Datensatz das Element Null aus.

Dies könnte kein ausgezeichneter Weg sein, dies mit dem nächsten Ansatz zu verbessern.

Ansatz 2

df.select("id").rdd.map(r => r(0)).collect.toList 
//res10: List[Any] = List(one, two, three)

Wie ist es besser Wir haben die Map-Transformationslast auf die Worker verteilt und nicht auf einzelne Treiber.

Ich weiß, rdd.map(r => r(0)) scheint dir nicht elegant. Lassen Sie uns im nächsten Ansatz darauf eingehen.

Ansatz 3

df.select("id").map(r => r.getString(0)).collect.toList 
//res11: List[String] = List(one, two, three)

Hier konvertieren wir DataFrame nicht nach RDD. In der map wird r => r(0) (oder _(0) ) aufgrund von Encoderproblemen in DataFrame nicht als vorheriger Ansatz akzeptiert. Verwenden Sie also am Ende r => r.getString(0) und es wird in den nächsten Versionen von Spark r => r.getString(0) .

Fazit

Alle Optionen geben die gleiche Ausgabe, aber 2 und 3 sind effektiv, schließlich ist die dritte effektiv und elegant (denke ich).

Databricks Notebook-Link, der ab dem 20.05.2017 bis 6 Monate verfügbar sein wird

Ich möchte eine Zeichenfolgenspalte eines Datenrahmens in eine Liste konvertieren. Was ich in der Dataframe API finden kann, ist RDD. Dataframe habe ich zuerst versucht, es wieder in RDD zu konvertieren und dann die Funktion toArray auf RDD anzuwenden. In diesem Fall funktionieren die Länge und SQL gut. Das Ergebnis von RDD enthält jedoch eckige Klammern um jedes Element wie dieses [A00001] . Ich habe mich gefragt, ob es eine geeignete Möglichkeit gibt, eine Spalte in eine Liste zu konvertieren oder die eckigen Klammern zu entfernen.

Anregungen wäre dankbar. Vielen Dank!


Dies sollte die Sammlung mit einer einzelnen Liste zurückgeben:

dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).collect()

Ohne das Mapping erhalten Sie nur ein Row-Objekt, das jede Spalte aus der Datenbank enthält.

Denken Sie daran, dass Sie dadurch wahrscheinlich eine Liste von Beliebiger Art erhalten. ÏWenn Sie den Ergebnistyp angeben möchten, können Sie .asInstanceOf [YOUR_TYPE] in der Zuordnung r => r(0).asInstanceOf[YOUR_TYPE]

PS: Aufgrund der automatischen Konvertierung können Sie den .rdd Teil überspringen.


Versuchen Sie in Scala und Spark 2+ df.select('s).as[String].collect vorausgesetzt, Ihr Spaltenname lautet "s"): df.select('s).as[String].collect


sqlContext.sql(" select filename from tempTable").rdd.map(r => r(0)).collect.toList.foreach(out_streamfn.println) //remove brackets

es funktioniert einwandfrei







spark-dataframe