Spark read json

spark.schema(schema).read.json / failfast mode

spark根据schema读json遇到一个问题:

  1. schema非常复杂,由嵌套的case class定义. 此处在类型和字段名定义上极容易出错。
  2. 读json的时候如果加入某个字段会导致所有的字段值为null, 没有该字段则一切正常,说明parse这个字段有问题。
  3. 代码运行没有打印任何异常,完全不知道是什么导致的。

看源码后发现parse json的异常会被swallow, 如果没有设置parse mode:

默认情况下mode是PermissiveMode, 此时如果有parse异常,row的所有字段都会为null。

如果是DropMalformedMode,则返回empty iterator,也就是malformed record会被drop掉。

如果是FailFastMode,会throw异常,将能在console看到exception stacktrace。

所以解决方法为将mode设置为FailFast来check是什么导致的parse error,随后根据stacktrace相应的做些fix即可。

// define your schema & jsonString
case class Data
val jsonString = ""
val df = spark.read.schema(Encoders.product[Data].schema)
      .option("mode", "FAILFAST")
      .json(Seq(jsonString).toDS)
df.show()