2017-10-15 64 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(_))