Как эффективно переименовывать столбцы в наборах данных (Spark 2.0)

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

Это кажется очень окольным и неэффективным способом просто переименовать столбец. Есть ли способ лучше?


person Janie    schedule 14.08.2016    source источник


Ответы (1)


Немного более кратким решением было бы что-то вроде этого:

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

но на практике переименование просто не имеет смысла для статически типизированного Dataset. Хотя мы используем то же столбцовое представление, что и Dataframe (Dataset[Row]), семантика здесь совершенно другая.

Имя столбца соответствует определенному полю хранимых объектов, поэтому его нельзя динамически переименовывать. Другими словами, Datasets не являются статически типизированными DataFrames, а являются коллекциями объектов.

person zero323    schedule 14.08.2016
comment
Я пытался избежать спуска в Dataframe и использовать только типобезопасные операции Dataset. Но я вижу вашу точку зрения, спасибо! - person Janie; 14.08.2016
comment
хорошо, но что, если вы сопоставляете набор данных, и результатом является набор данных, скажем, Ints. Теперь у вас есть набор данных Ints и столбец с именем value, но, возможно, вы захотите назвать его myInt. - person uh_big_mike_boi; 10.02.2018