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

时间:2019-05-07 20:49:21

标签: scala apache-spark null option case-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查询时自动取消装箱吗?

还请注意,上面的代码不正确。布尔类型不能为空。这只是一个例子。

1 个答案:

答案 0 :(得分:2)

在案例类中使用 Option Monad是正确的。读取时应通过火花将字段拆箱。

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)是存在的值。