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

