набор данных spark из json с внутренним массивом

Я пытаюсь прочитать json в набор данных (искра 2.1.1). К сожалению, это не работает. И терпит неудачу с:

Caused by: java.lang.NullPointerException: Null value appeared in non-
nullable field:
- field (class: "scala.Long", name: "age")

Любые идеи, что я делаю неправильно?

case class Owner(id: String, pets: Seq[Pet])
case class Pet(name: String, age: Long)

val sampleJson = """{"id":"kotek", "pets":[{"name":"miauczek", 
"age":18}, {"name":"miauczek2", "age":9}]}"""

val session = SparkSession.builder().master("local").getOrCreate()
import session.implicits._

val rdd = session.sparkContext.parallelize(Seq(sampleJson))
val ds = session.read.json(rdd).as[Owner].collect()

person Pawel Niezgoda    schedule 10.08.2017    source источник
comment
Я считаю, что это ошибка в искре. Если я правильно понимаю, что здесь происходит. искра НЕ отображает имя для этого внутреннего типа (домашние животные). И он использует отсортированный порядок для сопоставления этих атрибутов? Итак, pets.age сопоставляется с Pet.name, и при попытке сопоставить pets.name -> Pet.age он терпит неудачу за исключением случаев. Кто-нибудь может подтвердить, что я правильно понял, и это ошибка искры?   -  person Pawel Niezgoda    schedule 10.08.2017


Ответы (1)


Обычно, если какое-то поле может отсутствовать, используйте либо Option:

case class Owner(id: String, pets: Seq[Pet])
case class Pet(name: String, age: Option[Long])

или nullable введите:

case class Owner(id: String, pets: Seq[Pet])
case class Pet(name: String, age: java.lang.Long)

Но этот действительно выглядит как ошибка. Я проверил это в Spark 2.2, и к настоящему времени проблема решена. Я думаю, что быстрый обходной путь - сохранить поля, отсортированные по имени:

case class Owner(id: String, pets: Seq[Pet])
case class Pet(age: java.lang.Long, name: String)
person Community    schedule 10.08.2017