2016-01-22 2 views
27

Ich habe einen Funken Datenrahmen df. Gibt es eine Möglichkeit, unter Verwendung einer Liste dieser Spalten einige Spalten auszuwählen?Eine Liste aufladen, um mehrere Spalten aus einem Spark-Datenrahmen auszuwählen

scala> df.columns 
res0: Array[String] = Array("a", "b", "c", "d") 

Ich weiß, ich kann etwas wie df.select("b", "c") tun. Aber angenommen, ich habe eine Liste mit ein paar Spaltennamen val cols = List("b", "c"), gibt es eine Möglichkeit, dies an df.select zu übergeben? df.select(cols) löst einen Fehler aus. So etwas wie df.select(*cols) wie in Python

Antwort

48

Verwenden df.select(cols.head, cols.tail: _*)

Lassen Sie mich wissen, ob es funktioniert :)

Explanation from @Ben:

Der Schlüssel ist die Methode Signatur wählen:

select(col: String, cols: String*) 

Der Eintrag cols:String* benötigt eine variable Anzahl von Argumenten. :_* entpackt Argumente, damit sie von diesem Argument behandelt werden können. Sehr ähnlich zum Auspacken in Python mit *args. Weitere Beispiele finden Sie unter here und here.

+1

Dank! Lief wie am Schnürchen. Könnte man etwas mehr über die Syntax erklären? Was macht col.tail: _ *? – Ben

+8

Ich denke ich verstehe jetzt. Der Schlüssel ist die Methodensignatur von select 'select (col: String, cols: String *)'. Der Eintrag 'cols: String *' benötigt eine variable Anzahl von Argumenten. ': _ *' entpackt Argumente, damit sie von diesem Argument behandelt werden können. Sehr ähnlich dem Entpacken in Python mit '* args'. Siehe [hier] (http://Stackoverflow.com/a/1660768/4096199) und [hier] (http://StackOverflow.com/Questions/6051302/what-does-colon-undunders-Star-Do-in- scala) für andere Beispiele. – Ben

+0

Cool! Du hast es richtig gemacht :) Tut mir leid, ich habe beide Benachrichtigungen gerade jetzt, also konnte ich nicht früher antworten. :) –

12

Sie können String typisieren Spalte wie diese zu entfachen:

import org.apache.spark.sql.functions._ 
df.select(cols.map(col): _*) 
8

Eine weitere Option, die ich gerade gelernt haben.

import org.apache.spark.sql.functions.col 
val columns = Seq[String]("col1", "col2", "col3") 
val colNames = columns.map(name => col(name)) 
val df = df.select(colNames:_*) 
1

Sie Argumente vom Typ Column*-select passieren kann:

val df = spark.read.json("example.json") 
val cols: List[String] = List("a", "b") 
//convert string to Column 
val col: List[Column] = cols.map(df(_)) 
df.select(col:_*) 
+0

Was ist mit einer etwas kürzeren Version: 'df.select (cols.map (df (_)): _ *)'? – MaxU

Verwandte Themen