У меня проблемы с анализом 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, но, похоже, ее здесь нет.