3

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

これは、列の名前を変更するためだけに、非常に遠回しで非効率的な方法のようです。より良い方法はありますか?

4

2 に答える 2

4

もう少し簡潔な解決策は次のようになります。

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

しかし実際には、名前の変更は静的に型付けされた では意味がありませんDatasetDataframe( )と同じ列表現を使用していますが、Dataset[Row]ここではセマンティクスが完全に異なります。

列の名前は、保存されたオブジェクトの特定のフィールドに対応しているため、動的に名前を変更できるものではありません。つまりDatasets、静的に型付けされたものではなくDataFrames、オブジェクトのコレクションです。

于 2016-08-14T14:25:03.543 に答える