let x = new Row(job_id="hello", title=null)
x match {
case Row(
job_id: String,
title: Option[String]) => println("successful match")
case _ => println("failed!")
}
对于上面的代码,当我尝试与选项类型匹配时,它实际上与_
匹配,并给我以下警告:
warning: non-variable type argument String in type pattern Option[String] is unchecked since it is eliminated by erasure
基本上,Row结构代表具有可空值的sql行,我希望能够对其进行模式匹配。有人知道吗?
答案 0 :(得分:3)
请不要使用类型模式(: String
和: Option[String]
),因为null
与它们不匹配。写
case Row(job_id, title) =>
并检查内部。
(当您从Spark获得Row
时,它将不会包含任何Option[String]
,而仅包含空或非空的String
s(/ Int
s / etc。)。
您还可以使用自定义extractor objects,例如
object OptString {
def unapply(x: String) = Some(Option(x))
}
// repeat for other types
然后
case Row(job_id, OptString(title)) =>
将您的title
的{{1}}绑定到None
,而不会匹配
x