如何在Scala中匹配嵌套的选项值

时间:2019-03-15 00:38:55

标签: sql scala apache-spark pattern-matching

 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行,我希望能够对其进行模式匹配。有人知道吗?

1 个答案:

答案 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