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
相关产品推荐
相关产品推荐

