2017-10-15 63 views
1

如何将火花数据帧中的所有列名称获取到Seq变量中。获取Spark数据帧列表

输入数据&架构

val dataset1 = Seq(("66", "a", "4"), ("67", "a", "0"), ("70", "b", "4"), ("71", "d", "4")).toDF("KEY1", "KEY2", "ID") 

dataset1.printSchema() 
root 
|-- KEY1: string (nullable = true) 
|-- KEY2: string (nullable = true) 
|-- ID: string (nullable = true) 

我需要存储使用Scala编程中变量的所有列名。我试过如下,但它不起作用。

val selectColumns = dataset1.schema.fields.toSeq 

selectColumns: Seq[org.apache.spark.sql.types.StructField] = WrappedArray(StructField(KEY1,StringType,true),StructField(KEY2,StringType,true),StructField(ID,StringType,true)) 

预期输出:

val selectColumns = Seq(
    col("KEY1"), 
    col("KEY2"), 
    col("ID") 
) 

selectColumns: Seq[org.apache.spark.sql.Column] = List(KEY1, KEY2, ID) 

回答

2

我使用的列PR像这样

val cols = dataset1.columns.toSeq 

,然后,如果你以后选择所有列在序列的顺序,从头部到尾部,你可以使用

val orderedDF = dataset1.select(cols.head, cols.tail:_ *) 
2

您可以使用下面的命令:

val selectColumns = dataset1.columns.toSeq 

scala> val dataset1 = Seq(("66", "a", "4"), ("67", "a", "0"), ("70", "b", "4"), ("71", "d", "4")).toDF("KEY1", "KEY2", "ID") 
dataset1: org.apache.spark.sql.DataFrame = [KEY1: string, KEY2: string ... 1 more field] 

scala> val selectColumns = dataset1.columns.toSeq 
selectColumns: Seq[String] = WrappedArray(KEY1, KEY2, ID) 
+0

输出operty应序列[org.apache。 spark.sql.Column],而不是List [String]。 – raam

+0

@raam - 你想用输出/列名称做什么?为什么你需要它是类型的列? – Yaron

+0

我需要通过中间结果来实现这个逻辑。所以我需要列的输出 – raam

2
val selectColumns = dataset1.columns.toList.map(col(_))