You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:06:23