Spark 2 Наборы данных опций

У меня есть набор данных строк, который я анализирую в набор данных класса case с помощью функции, которая может дать сбой (например, если данные, которые я пытаюсь проанализировать, не могут быть использованы). По этой причине эта функция возвращает Option (Scala). Таким образом, я получаю набор данных Option [MyCaseClass].

Spark, кажется, принимает этот набор данных и обрабатывает его, но вместо того, чтобы возвращать None если синтаксический анализ не удается, он возвращает мне 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...

А вот записная книжка, иллюстрирующая дело https://databricks-prod-cloudfront.cloud.databricks.com/public/4027ec902e239c93eaaa8714f173bcfc/4480125715694487/1289561535151709/7956941984681624/latest.html

Я предполагаю, что при сериализации, а затем десериализации значения Option Spark использует конструктор Some() вместо проверки, является ли Option значением Some или None.

Очевидно, я мог бы создать обертку вокруг моего объекта, что-то вроде MaybeArticle(article: Option[Article]), но я хотел бы знать, может ли Spark правильно обрабатывать наборы данных параметров?

1 ответ

Решение

Я думаю, что решение будет использовать flatMap, Вот действительно глупый пример:

scala> val ds = Seq(("a1"), ("a2"), ("a4"), ("b1"), ("b2")).toDS
ds: org.apache.spark.sql.Dataset[String] = [value: string]

scala> ds.show 
+-----+        
|value|        
+-----+        
|   a1|        
|   a2|        
|   a4|        
|   b1|        
|   b2|        
+-----+        

scala> val ds2 = ds.flatMap{x => if (x.contains("a")) Some(x) else None}
ds2: org.apache.spark.sql.Dataset[String] = [value: string]

scala> ds2.show
+-----+
|value|
+-----+
|   a1|
|   a2|
|   a4|
+-----+

Это работает потому, что Some а также None действовать как коллекции, которые можно распаковать с помощью flatMap (где None элементы просто опущены).

Другие вопросы по тегам