【问题标题】:spark dataset from json with inner array来自带有内部数组的json的火花数据集
【发布时间】:2018-01-18 10:03:08
【问题描述】:

我正在尝试将 json 读入数据集(spark 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()

【问题讨论】:

  • 我相信这是火花中的一个错误。如果我正确理解这里发生了什么。 spark 不是按名称映射该内部类型(“宠物”)。他正在使用排序顺序来映射这些属性?所以 pets.age 被映射到 Pet.name,并且在尝试映射 pets.name -> Pet.age 时,他失败了。任何人都可以确认我的理解是正确的,这是火花错误?

标签: json scala apache-spark apache-spark-sql apache-spark-dataset


【解决方案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)

但这确实看起来像一个错误。我测试了这个 ins Spark 2.2,现在已经解决了。我认为快速的解决方法是保持字段按名称排序:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2021-01-14
    • 2021-11-05
    • 2020-08-06
    相关资源
    最近更新 更多