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

在Azure Synapse Notebook读取多行JSON遇重复列问题求助

解决PySpark读取多行JSON日志的重复列问题及相关需求实现

一、先处理重复列报错

你设置multiLine=true出错,是因为你的数据是每行一个独立JSON对象,这种场景应该用默认的单行模式(multiLine=true是给整个文件为单个JSON对象的情况)。改回单行模式后,如果仍因不同行存在同名但路径/类型不同的level字段报错,可通过自定义schema明确字段结构来避免冲突:

from pyspark.sql.types import StructType, StructField, StringType

# 假设你需要的level在properties嵌套结构下,顶层可能也有同名字段,用schema区分路径
custom_schema = StructType([
    StructField("top_level_level", StringType(), nullable=True),
    StructField("properties", StructType([
        StructField("level", StringType(), nullable=True),
        # 按需添加其他嵌套字段
    ]))
])

# 用自定义schema读取
df = spark.read.schema(custom_schema).json(uri)

二、将JSON加载为字典解析

可以先把文件读成RDD,每行解析为字典后再处理嵌套数据:

import json

# 读取文本文件为RDD,每行转成字典
json_rdd = spark.sparkContext.textFile(uri).map(lambda line: json.loads(line))

# 在RDD层面提取需要的嵌套字段
processed_rdd = json_rdd.map(lambda d: {
    "target_level": d["properties"]["level"],
    "resource_id": d["resourceId"],
    # 按需添加其他字段
})

# 转成DataFrame
df = processed_rdd.toDF()

三、仅读取文件的部分内容

方法1:直接提取目标字段

读取后用select直接选择需要的嵌套字段,无需加载全量数据:

df = spark.read.json(uri).select(
    "properties.level",
    "properties.resourceId",
    "top_level_field"  # 按需添加顶层字段
)

方法2:采样读取(用于测试)

如果只是验证数据,可读取部分行或按比例采样:

# 读取前100行
df = spark.read.json(uri).limit(100)

# 按10%比例随机采样
df = spark.read.json(uri).sample(fraction=0.1)

方法3:用极简schema过滤字段

自定义schema时只定义需要的字段,Spark会自动忽略其他无关字段:

from pyspark.sql.types import StructType, StructField, StringType

minimal_schema = StructType([
    StructField("properties", StructType([
        StructField("level", StringType(), nullable=True),
        StructField("resourceId", StringType(), nullable=True)
    ]))
])

df = spark.read.schema(minimal_schema).json(uri)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:48:22