【问题标题】:How to efficiently rename columns in Datasets (Spark 2.0)如何有效地重命名数据集中的列 (Spark 2.0)
【发布时间】:2016-12-20 18:34:32
【问题描述】:

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

这似乎只是重命名列的一种非常迂回且低效的方法。有没有更好的办法?

【问题讨论】:

    标签: apache-spark apache-spark-dataset


    【解决方案1】:

    你可以让它更简洁一些,同时保持语义:

    origDS.map(o => OrigRenamed(o.a, o.b)).show()
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 我试图避免下降到Dataframe,并且只使用类型安全的Dataset 操作。但我明白你的意思,谢谢!
      • 好的,但是如果你映射一个数据集并且结果是一个数据集,比如 Ints。现在您有一个 Ints 数据集,列名为“value”,但也许您想将其称为“myInt”
      猜你喜欢
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2019-06-18
      • 1970-01-01
      • 2017-02-07
      • 2019-05-18
      • 2023-03-12
      相关资源
      最近更新 更多