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

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)

关键注意事项

  1. 大小写敏感:Spark Schema字段名必须与JSON中的字段名完全一致(包括大小写);
  2. 嵌套结构匹配:JSON中的数组必须用ArrayType定义,对象必须用StructType定义;
  3. 类型兼容性:字段类型要覆盖JSON中的所有可能值(比如tech同时有数值和字符串,需用StringType);
  4. multiline参数:多行JSON必须开启该参数,否则Spark会按行拆分读取,导致结构解析失败。

内容的提问来源于stack exchange,提问作者David Del Río Diaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:50:36