我有一个案例课
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查询时自动取消装箱吗?
还请注意,上面的代码不正确。布尔类型不能为空。这只是一个例子。
答案 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)
是存在的值。