如何在由案例列表 类 组成的数据集中表示空值

How to represent nulls in DataSets consisting of list of case classes

我有案例class

  final case class FieldStateData(
                                   job_id: String = null,
                                   job_base_step_id: String = null,
                                   field_id: String = null,
                                   data_id: String = null,
                                   data_value: String = null,
                                   executed_unit: String = null,
                                   is_doc: Boolean = null,
                                   mime_type: String = null,
                                   filename: String = null,
                                   filesize: BigInt = null,
                                   caption: String = null,
                                   executor_id: String = null,
                                   executor_name: String = null,
                                   executor_email: String = null,
                                   created_at: BigInt = null
                                 )

我想用作 Dataset[FieldStateData] 类型的数据集的一部分,最终插入到数据库中。所有列都必须可以为空。我将如何表示从 Any 而不是任何字符串派生的数字的空类型?我考虑过使用 Option[Boolean] 或类似的东西,但它会在插入期间或用作 sql 查询时自动拆箱吗?

另请注意,以上代码不正确。布尔类型不可为空。这只是一个例子。

在案例 class 中,您使用 Option Monad 是正确的。该字段应在读取时由 spark 拆箱。

import org.apache.spark.sql.{Encoder, Encoders, Dataset}

final case class FieldStateData(job_id: Option[String],
                                job_base_step_id: Option[String],
                                field_id: Option[String],
                                data_id: Option[String],
                                data_value: Option[String],
                                executed_unit: Option[String],
                                is_doc: Option[Boolean],
                                mime_type: Option[String],
                                filename: Option[String],
                               filesize: Option[BigInt],
                               caption: Option[String],
                               executor_id: Option[String],
                               executor_name: Option[String],
                               executor_email: Option[String],
                               created_at: Option[BigInt])
implicit val fieldCodec: Encoder[FieldStateData] = Encoders.product[FieldStateData]

val ds: Dataset[FieldStateEncoder] = spark.read.source_name.as[FieldStateData]

当您将 Dataset 写回数据库时,None 变为 null 值,Some(x) 是存在的值。