Spark中如何定义结构体数组Schema?解析返回null如何解决?
问题原因
解析返回null的核心原因是定义的Schema和待解析JSON的实际结构完全不匹配,具体错点:
- 待解析的最外层JSON是数组结构(内容为两个对象组成的数组),但定义的根Schema是结构体类型,还声明了
colA、colB两个根本不存在的顶层字段,Spark按照给定Schema匹配不到对应结构,直接返回null。 - 数组内的两个对象是同构数组的元素(只是各自缺失了部分字段),不是顶层下两个并列的结构体字段,把数组元素错误映射成顶层的两个独立字段,完全不符合JSON的层级逻辑。
修正方法
按照JSON实际层级定义Schema即可:最外层声明为数组类型,数组内部的元素结构体同时声明a、b两个可空字符串字段,缺失字段解析时会自动填充为null。
修正后的可运行代码:
import org.apache.spark.sql.types._ import org.apache.spark.sql.functions._ val data = Seq("""[{"a": "6"},{"b":"7"}]""").toDF("value") // 匹配JSON结构的正确Schema val schema = ArrayType( StructType(Seq( StructField("a", StringType, nullable = true), StructField("b", StringType, nullable = true) )), containsNull = true ) val res = data.withColumn("res", from_json(col("value"), schema)) res.show(truncate = false)
执行后res列会正常返回解析结果:数组第一个元素的a字段值为"6"、b字段为null;第二个元素的b字段值为"7"、a字段为null,不会出现整值为null的情况。如果需要把数组内容展开为单独行,可以后续搭配explode函数处理。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

