Как сопоставить вложенные значения параметров в Scala - PullRequest
0 голосов
/ 15 марта 2019
 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 Ответ

3 голосов
/ 15 марта 2019

Только не используйте шаблоны типов (: String и : Option[String]), потому что null не соответствует им. Написать

case Row(job_id, title) =>

и проверьте внутри.

(Когда вы получаете Row от Spark, он все равно не будет содержать Option[String] с, просто ноль или ненулевой String с (/ Int с / и т. Д.).

Вы также можете использовать пользовательские объекты-экстракторы , например,

object OptString {
  def unapply(x: String) = Some(Option(x))
}
// repeat for other types

, затем

case Row(job_id, OptString(title)) =>

свяжет title с None для вашего x и не будет соответствовать

new Row("hello", notAString) 
...