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

Spark Schema不匹配时为何返回Null?如何实现快速失败?

Spark Schema匹配问题解析

数据示例

{"name": "name1", "id": 1}
{"name": "name2", "id": "1"}

指定Schema读取的代码与输出

代码

val schema =
  """
    |    name STRING,
    |    id BIGINT
    |""".stripMargin
spark.read.schema(schema).json("my_path").show

输出

+-----+----+
| name|  id|
+-----+----+
|name1|   1|
|name2|null|
+-----+----+

自动推断Schema的代码与输出

代码

spark.read.json("my_path").printSchema()

输出

root
 |-- id: string (nullable = true)
 |-- name: string (nullable = true)

1. 为何会得到Null值?

第二条数据的id是JSON字符串类型"1",而你指定的Schema中id定义为BIGINT(对应JSON的数值类型)。Spark按指定Schema解析时,会严格匹配原始JSON的类型:只有当原始数据类型和Schema定义类型一致时才会正常解析,类型不匹配的字段会被设为null。第一条数据的id是JSON数值类型1,和Schema匹配,所以能正常解析。

2. 程序为何未失败?

这是Spark JSON数据源的默认容错行为:为了避免部分数据的格式问题导致整个任务终止,Spark会自动将类型不匹配的字段置为null,而非直接抛出异常。这种设计优先保证任务能继续执行,而非严格校验数据。

3. 如何在Schema不匹配时实现快速失败?

可以通过设置Spark配置项,强制在类型不匹配或字段缺失时抛出异常终止任务:

// 开启类型不匹配时的失败机制
spark.conf.set("spark.sql.json.parser.failOnDataTypeMismatch", true)
// 开启字段缺失时的失败机制(可选)
spark.conf.set("spark.sql.json.parser.failOnMissingFields", true)

// 再执行读取操作
val schema =
  """
    |    name STRING,
    |    id BIGINT
    |""".stripMargin
spark.read.schema(schema).json("my_path").show

此时遇到类型不匹配的数据,程序会直接抛出JsonIncompatibleSchemaException异常,快速终止任务。

内容的提问来源于stack exchange,提问作者Cherry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 17:28:15