我有一个字符串数据集,我使用可能失败的函数将其解析为案例类的数据集(例如,如果我尝试解析的数据不可用)。出于这个原因,该函数返回一个选项(Scala)。所以我最终得到了一个 Option[MyCaseClass] 的数据集。
Spark 似乎接受了该 Dataset 并对其进行处理,但None
如果解析失败,它不会返回 a 而是返回我 a Some(MyCaseClass(null, null...))
。
这是一个这样做的代码示例:
recordsDs
.map { record =>
val maybeArticle = unmarshallArticle(record)
if (maybeArticle.isEmpty) {
println(s"Could not parse record $record into an article.")
}
maybeArticle
}
.filter(_.isDefined)
.map(_.get)
.collect().toList // Always returns a List(Some(Article(null, null), Some(Article...
我的猜测是,在序列化然后反序列化 Option 值时 Spark 使用 Some() 构造函数,而不是检查 Option 是 Some 还是 None。
我显然可以在我的对象周围创建一个包装器,例如MaybeArticle(article: Option[Article])
,但我想知道 Spark 是否可以正确处理 Options 数据集?