Spark read json
spark.schema(schema).read.json / failfast mode
spark根据schema读json遇到一个问题:
- schema非常复杂,由嵌套的case class定义. 此处在类型和字段名定义上极容易出错。
- 读json的时候如果加入某个字段会导致所有的字段值为null, 没有该字段则一切正常,说明parse这个字段有问题。
- 代码运行没有打印任何异常,完全不知道是什么导致的。
看源码后发现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()