2016-10-07 92 views
2

我想找到一個很好的方式做列表[列,我爆炸列比傳回我感興趣的所有列與爆炸列。Spark列表選擇一個列列Scala

var columns = getColumns(x) // Returns a List[Column] 
tempDf.select(columns) //trying to get 

試圖找到這樣做的一個很好的方式,我知道,如果它是一個字符串,我可以做喜歡

val result = dataframe.select(columnNames.head, columnNames.tail: _*) 
+3

您使用的是哪個版本的Spark? 1.6.0提供'def select(cols:Column *):DataFrame'應該按照你的意願去做? – LiMuBei

+0

我正在使用2.0.0。我將如何使用它,因爲我試着給出選擇列表[Column]和Seq [Column]。沒有一個工作,我也看到了這種方法,但我無法使用它。我將如何分解該調用中的列表以利用它? – neuroh

+0

'val result = dataframe.select(columns:_ *)' –

回答

5

東西火花2.0看來,你有兩個選擇。兩者都取決於你如何管理你的列(字符串或列)。

星火代碼(火花sql_2.11 /組織/阿帕奇/火花/ SQL/Dataset.scala):

def select(cols: Column*): DataFrame = withPlan { 
    Project(cols.map(_.named), logicalPlan) 
} 

def select(col: String, cols: String*): DataFrame = select((col +: cols).map(Column(_)) : _*) 

你可以看到火花內部是如何將你的head & tail到列表的列再次調用Select

所以,在這種情況下,如果你想有一個清晰的代碼,我會建議:

如果列:列表[字符串]

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

否則,如果列:列表[專欄]

df.select(columns: _*)