2016-06-28 325 views
3

加入兩個數據框後,我發現列順序已經改變了我的設想。例如:將[b,c,d,e][a,b]b的列連​​接的兩個數據幀產生列順序[b,a,c,d,e]Spark Dataframes:如何更改Java/Scala中列的順序?

如何更改列的順序(例如,[a,b,c,d,e])? 我已經找到了在Python/R中執行它的方法,但不是Scala或Java。是否有任何方法允許交換或重新排序數據幀列?

+0

http://stackoverflow.com/help/how-to-ask –

回答

2

一個這樣做的方式你加入後重新排序:

case class Person(name : String, age: Int) 
val persons = Seq(Person("test", 10)).toDF 

persons.show 
+----+---+ 
|name|age| 
+----+---+ 
|test| 10| 
+----+---+ 

persons.select("age", "name").show 

+---+----+ 
|age|name| 
+---+----+ 
| 10|test| 
+---+----+ 
+0

一旦數據幀變成在其列數笨重和順序是更比單個交換還是兩個,還有其他什麼方法?我的猜測是關於'columns()'(Java API)的... –

4

在Scala中可以使用"splat":_*)語法列的可變長度列表傳遞給DataFrame.select()方法。

要解決您的示例,您可以通過DataFrame.columns獲取現有列的列表,該列返回字符串數組。然後,只需對該數組進行排序並將值轉換爲列。然後可以「圖示」出到select()方法:

val mySortedCols = myDF.columns.sorted.map(str => col(str)) 
// Array[String]=(b,a,c,d,e) => Array[Column]=(a,b,c,d,e) 

val myNewDF = myDF.select(mySortedCols:_*)