Azure Synapse Notebook中Scala加载JSON文件异常问题求助
解决Azure Synapse Scala Spark读取JSON的两类问题:全Null结果与_corrupt_record字段
问题1:指定StructType Schema后DataFrame全为Null
核心原因
Spark Schema默认大小写敏感,且嵌套结构、字段类型必须与JSON完全匹配,否则会导致字段匹配失败,返回Null。针对你提供的示例JSON,常见错误点包括:
- 字段名大小写不匹配(比如将
cod写成COD); - 嵌套层级错误(未用
ArrayType包裹数组结构,比如results、columns、items都是数组); - 字段类型不匹配(比如
tech字段包含字符串"-",却用IntegerType定义)。
正确Schema定义与读取代码
import org.apache.spark.sql.types._ // 定义最内层columns的Schema val columnSchema = StructType(Seq( StructField("name", StringType, nullable = true), StructField("type", StringType, nullable = true) )) // 定义items的Schema(注意tech字段用StringType兼容数值和字符串值) val itemSchema = StructType(Seq( StructField("cod", IntegerType, nullable = true), StructField("tech", StringType, nullable = true), StructField("object", StringType, nullable = true) )) // 定义results数组元素的Schema val resultSchema = StructType(Seq( StructField("columns", ArrayType(columnSchema), nullable = true), StructField("items", ArrayType(itemSchema), nullable = true) )) // 完整Schema val fullSchema = StructType(Seq( StructField("results", ArrayType(resultSchema), nullable = true) )) // 读取JSON文件 val df = spark.read .schema(fullSchema) .option("multiline", "true") // 必须开启,因为JSON是多行结构 .json("/path/to/your/json/file.json") // 验证结果 df.show(false)
问题2:不指定Schema时出现_corrupt_record字段(含multiline=true仍异常)
核心原因
multiline参数设置位置错误(必须在json()方法之前调用);- JSON文件存在编码问题(比如UTF-8带BOM,Spark无法自动识别);
- 读取模式未正确配置(默认
PERMISSIVE但仍可能因格式问题生成脏数据)。
解决方案代码
val df = spark.read .option("multiline", "true") // 确保先设置multiline再指定文件路径 .option("encoding", "UTF-8") // 指定编码,解决BOM或编码不兼容问题 .option("mode", "PERMISSIVE") // 保留脏数据并标记,若要丢弃可改为"DROPMALFORMED" .json("/path/to/your/json/file.json") // 查看Schema和数据 df.printSchema() df.show(false)
关键注意事项
- 大小写敏感:Spark Schema字段名必须与JSON中的字段名完全一致(包括大小写);
- 嵌套结构匹配:JSON中的数组必须用
ArrayType定义,对象必须用StructType定义; - 类型兼容性:字段类型要覆盖JSON中的所有可能值(比如
tech同时有数值和字符串,需用StringType); - multiline参数:多行JSON必须开启该参数,否则Spark会按行拆分读取,导致结构解析失败。
内容的提问来源于stack exchange,提问作者David Del Río Diaz
相关产品推荐
相关产品推荐

