使用DataFrames,可以使用df.withColumnRename("oldName", "newName")
简单地重命名列。在数据集中,由于每个字段都是键入和命名的,因此这似乎不可能。我能想到的唯一工作就是在数据集上使用map
:
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 :(得分:1)
稍微更简洁的解决方案是这样的:
origDS.toDF("a", "bNewName").as[OrigRenamed]
但实际上重命名对静态类型Dataset
没有意义。虽然我们使用与Dataframe
(Dataset[Row]
)相同的列式表示,但语义在这里完全不同。
列的名称对应于存储对象的特定字段,因此不能动态重命名。换句话说,Datasets
不是静态类型DataFrames
,而是对象集合。