如何将空值分配给复杂类型的列?

How to assign an empty value to a column of complex type?

我正在尝试将数据帧转换为与模型 EmailToSend 对应的数据集。

我的模型对象:

object Models {
    case class EmailToSend(
        a1: String,
        promoCodeTemplate: Option[PromoCodeTemplate]
    )

    case class PromoCodeTemplate(
        b1: String
    )
}

我的代码:

val myDataset: Dataset[Models.EmailToSend] = myDf.as[Models.EmailToSend]

myDf 包含 EmailToSend 所需的所有列,promoCodeTemplate 除外。因此,此代码在运行时失败:

cannot resolve '`promoCodeTemplate`' given input columns: [a1];

promoCodeTemplate 从该数据框中丢失,这是我所期望的。稍后会填写,但目前必须为空:没有促销代码模板,这是正常的。

问题是,如果不填写促销代码模板,我将无法完成这项工作。我尝试添加一个带有 withColumn 的空值,但我尝试的任何值都不起作用。

val myDataset: Dataset[Models.EmailToSend] = myDf
    // this is one of the many values I tried
    .withColumn("promoCodeTemplate", lit(null.asInstanceOf[Models.PromoCodeTemplate]).cast(Models.PromoCodeTemplate))
    .as[Models.EmailToSend]

如何为 promoCodeTemplate 列分配一个空值?

您应该创建一个空结构字段以匹配 spark 类型与大小写 class PromoCodeTemplate.

val myDataset = myDF.withColumn("promoCodeTemplate", struct(lit("").as("b1"))).as[EmailToSend]

或者,您也可以使用下面的行,

myDF.withColumn("promoCodeTemplate", typedLit(PromoCodeTemplate(""))).as[EmailToSend]

要简单地添加空值,

myDF.withColumn("promoCodeTemplate", typedLit(null.asInstanceOf[PromoCodeTemplate])).as[EmailToSend]