Разбор JSON в классы с типами аргументов Option [T] в spark-shell с помощью Scala - PullRequest
0 голосов
/ 26 мая 2018

У меня проблемы с анализом JSON с json4s.jackson в spark-shell.То же самое прекрасно работает в sbt repl.

Интересно, есть ли обходной путь для используемой версии Spark.

  • spark-shell v1.6, scala v2.10.5
  • sbt repl scala v 2.11.8

.

Следующий пример демонстрирует проблему.

  • sbt repl работает, как и ожидалось, для всех примеров.
  • дроссельные заслонки и выдает ошибку для val c.Что странно, так это то, что он кажется подавленным Option[Int] или Option[Double], но он отлично работает для Option[A], где класс A.

.

import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods.{render,compact,pretty}

import org.json4s.DefaultFormats
import org.json4s.jackson.JsonMethods._
import org.json4s.{JValue, JObject} 

implicit val formats = DefaultFormats


class A(val a: Int, val aa: Int)
class B(val b: Int, val optA: Option[A]=None)
class C(val b: Int, val bb: Option[Int]=None)

val jb_optA_nested: JObject     = ("b" -> 5) ~ ("optA" -> ("a" -> 999) ~ ("aa" -> 1000))
val jb_optA_not_nested: JObject = ("b" -> 5) ~ ("a" -> 999) ~ ("aa" -> 1000)
val jb_optA_none: JObject       = ("b" -> 5)
val jc: JObject                 = ("b" -> 5) ~ ("bb" -> 100)


val b_nested     = jb_optA_nested.extract[B]      // works as expected in both (optA=Some(A(999,1000)))
val b_not_nested = jb_optA_not_nested.extract[B]  // works as expected in both (optA=None)
val b_none       = jb_optA_none.extract[B]        // works as expected in both (optA=None)
val c            = jc.extract[C]                  // error in spark-shell; works fine in sbt repl

сгенерированная ошибка: org.json4s.package$MappingException: Can't find constructor for C

Единственное реальное отличие, которое я могу найти (кроме версий Scala), в том, что в spark-shell ... он задыхается в Option [native types] и, кажется, работает на Option [пользовательские классы.Но, возможно, это совпадение.

В таких сообщениях ... JSON4s не может найти конструктор с / spark Я вижу комментарии, где люди предполагают, что структура класса не соответствует JSON ..... но для меня class C и val jc выглядят одинаково.

Также следует отметить, что эта ошибка сохраняется, когда я укрепляю определения классов и функции в .JAR и импортирую определения в spark-shell избаночка вместо определения в репл.иногда это относится к свече 1.6, но, похоже, ее здесь нет.

1 Ответ

0 голосов
/ 26 мая 2018

Вы пробовали:

class C(val b: Int, val bb: Option[java.lang.Integer]=None)

У меня раньше были проблемы со Scala Int с Json4s - хотя я не могу точно вспомнить, что это было.

Также делаюcase class стоит с Int - по какой причине вы предпочитаете обычный class?Я не вижу никаких var с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...