从火花数据框中选择几列,并以列列表作为开始

chi*_*lus 3 scala apache-spark

假设我有一个火花列列表和一个火花数据框 df,为了选择一个只包含列表中的列的子数据框,合适的代码片段是什么?

类似于可能的东西:

var needed_column: List[Column]=List[Column](new Column("a"),new Column("b"))

df(needed_columns)
Run Code Online (Sandbox Code Playgroud)

我想获取列名称,然后使用以下代码行选择它们。

不幸的是,列名似乎仅处于写入模式。

df.select(needed_columns.head.as(String),needed_columns.tail: _*)
Run Code Online (Sandbox Code Playgroud)

Leo*_*o C 6

needed_columns的类型为List[Column],因此您可以简单地将其needed_columns: _*用作 的参数select

val df = Seq((1, "x", 10.0), (2, "y", 20.0)).toDF("a", "b", "c")

import org.apache.spark.sql.Column

val needed_columns: List[Column] = List(new Column("a"), new Column("b"))

df.select(needed_columns: _*)
// +---+---+
// |  a|  b|
// +---+---+
// |  1|  x|
// |  2|  y|
// +---+---+
Run Code Online (Sandbox Code Playgroud)

请注意,select接受两种类型的参数:

def select(cols: Column*): DataFrame

def select(col: String, cols: String*): DataFrame
Run Code Online (Sandbox Code Playgroud)

如果您有String类型的列名列表,则可以使用后者select

val needed_col_names: List[String] = List("a", "b")

df.select(needed_col_names.head, needed_col_names.tail: _*)
Run Code Online (Sandbox Code Playgroud)

或者,您可以将Strings列表映射到Columns 以使用前者select

df.select(needed_col_names.map(col): _*)
Run Code Online (Sandbox Code Playgroud)