Spark选择列Scala列表

neu*_*roh 5 scala apache-spark

我正在尝试找到一个使用List [Column进行spark选择的好方法,我正在爆炸一个列,而不是使用我的爆炸列传回我感兴趣的所有列.

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

试着找到一个好方法,我知道,如果它是一个字符串,我可以做类似的事情

val result = dataframe.select(columnNames.head, columnNames.tail: _*)
Run Code Online (Sandbox Code Playgroud)

Fra*_*nzi 15

对于spark 2.0来说,你有两种选择.两者都取决于您管理列(字符串或列)的方式.

Spark代码(spark-sql_2.11/org/apache/spark/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(_)) : _*)
Run Code Online (Sandbox Code Playgroud)

您可以看到内部spark如何将您转换head & tail为要再次调用的列列表Select.

那么,在这种情况下,如果你想要一个清晰的代码,我会建议:

如果列:List [String]:

import org.apache.spark.sql.functions.col
df.select(columns.map(col): _*)
Run Code Online (Sandbox Code Playgroud)

否则,如果列:列表[列]:

df.select(columns: _*)
Run Code Online (Sandbox Code Playgroud)