Spark Frameless withColumnRenamed вложенное поле - PullRequest
0 голосов
/ 26 ноября 2018

Допустим, у меня есть следующий код

case class MyTypeInt(a: String, b: MyType2)
case class MyType2(v: Int)
case class MyTypeLong(a: String, b: MyType3)
case class MyType3(v: Long)

val typedDataset = TypedDataset.create(Seq(MyTypeInt("v", MyType2(1))))
typedDataset.withColumnRenamed(???, typedDataset.colMany('b, 'v).cast[Long]).as[MyTypeLong]

Как я могу реализовать это преобразование, когда поле, которое я пытаюсь преобразовать, вложено?подпись withColumnRenamed запрашивает символ в первом параметре, поэтому я не знаю, как это сделать ...

1 Ответ

0 голосов
/ 27 ноября 2018

withColumnRenamed не позволяет преобразовать столбец.Для этого вы должны использовать withColumn.Один из подходов заключается в том, чтобы привести столбец и воссоздать структуру.

scala> val new_ds = ds.withColumn("b", struct($"b.v" cast "long" as "v")).as[MyTypeLong]
scala> new_ds.printSchema
root
|-- a: string (nullable = true)
|-- b: struct (nullable = false)
|    |-- v: long (nullable = true) 

Другой подход заключается в использовании map и создании объекта самостоятельно:

ds.map{ case MyTypeInt(a, MyType2(b)) => MyTypeLong(a, MyType3(b)) } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...