2016-08-14 40 views
2

使用DataFrame,可以使用df.withColumnRename("oldName", "newName")簡單重命名列。在數據集中,由於每個字段都是鍵入和命名的,所以這似乎不可行。圍繞我能想到的唯一工作就是對數據集使用map如何高效重命名數據集中的列(Spark 2.0)

case class Orig(a: Int, b: Int) 
case class OrigRenamed(a: Int, bNewName: Int) 

val origDS = Seq(Orig(1,2), Orig(3,4)).toDS 
origDS.show 
+---+---+ 
| a| b| 
+---+---+ 
| 1| 2| 
| 3| 4| 
+---+---+ 

// To rename with map 
val origRenamedDS = origDS.map{ case Orig(x,y) => OrigRenamed(x,y) } 
origRenamed.show 
+---+--------+ 
| a|bNewName| 
+---+--------+ 
| 1|  2| 
| 3|  4| 
+---+--------+ 

這似乎是一個很迂迴的和低效的方式只是重命名列。有沒有更好的辦法?

回答

0

稍微更簡潔的解決辦法是這樣的:

origDS.toDF("a", "bNewName").as[OrigRenamed] 

但在實踐中重新命名是根本沒有意義的靜態類型Dataset。儘管我們使用與DataframeDataset[Row])相同的柱狀表示,但在此語義完全不同。

列的名稱對應於存儲對象的特定字段,因此它不是可以動態重命名的內容。換句話說,Datasets不是靜態類型的DataFrames,而是對象的集合。

+0

我試圖避免下降到'Dataframe',並只使用類型安全'數據集'操作。但我明白你的觀點,謝謝! – Janie

+0

好吧,但如果你映射一個數據集,結果是一個數據集,比如Ints。現在你有一個Ints數據集,並且該列被命名爲「value」,但也許你想稱之爲「myInt」 –

相關問題