Spark无框架withColumn重命名嵌套字段

时间:2018-11-26 12:03:49

标签: scala apache-spark frameless

假设我有以下代码

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 :(得分:1)

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)) }