如何有效地重命名数据集中的列(Spark 2.0)

时间:2016-08-14 07:28:59

标签: apache-spark apache-spark-dataset

使用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|
+---+--------+

这似乎是一种非常圆润且低效的方式来重命名一个列。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

稍微更简洁的解决方案是这样的:

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

但实际上重命名对静态类型Dataset没有意义。虽然我们使用与DataframeDataset[Row])相同的列式表示,但语义在这里完全不同。

列的名称对应于存储对象的特定字段,因此不能动态重命名。换句话说,Datasets不是静态类型DataFrames,而是对象集合。