Databricks 7.3LTS升9.1LTS后读含重复列JSON创建DataFrame报错
解决方案
你可以通过以下几种方式解决该问题,无需完整预定义Schema:
1. 开启旧版本兼容配置(最简便)
Databricks Runtime 9.1基于Spark 3.1.2,默认开启了重复列名校验,你可以在读取数据前执行以下配置,兼容低版本允许重复列名的行为:
# 全局生效,当前Notebook所有后续操作都允许重复列名 spark.conf.set("spark.sql.legacy.allowDuplicateColumnNames", True)
配置完成后再执行原读取代码即可正常生成DataFrame,后续你可以正常select需要的字段、忽略重复的tags字段即可。
2. 仅针对本次读取生效(不修改全局配置)
如果你不想修改全局配置,可以先采样生成Schema后修剪掉重复字段,再用修剪后的Schema读取数据:
from pyspark.sql.types import StructType # 先读取小批量数据采样得到原始Schema sample_df = spark.read.option("multiline","true").option("samplingRatio", 0.01).json(f"{path}/IN-109418_Part_1.json") raw_schema = sample_df.schema # 移除Schema中重复的tags字段,保留其余字段 # 如果是嵌套层级下的tags字段,递归遍历对应父StructType移除子字段即可 clean_schema = StructType([f for f in raw_schema.fields if f.name != 'tags']) # 用修剪后的Schema读取全量数据 intermediate_df = spark.read.option("multiline","true").schema(clean_schema).json(f"{path}/IN-109418_Part_1.json")
该方案不需要手动编写整个复杂嵌套Schema,仅需要对自动采样生成的Schema做少量修剪即可,后续新增字段也会自动被采样识别,不会遗漏。
3. CSV格式同问题的处理方式
如果是CSV文件遇到同类重复列报错,除了开启上述兼容配置外,还可以在读取时指定header=False,读取后手动给列重命名,再筛选需要的列即可。
内容的提问来源于stack exchange,提问作者Nirupam Nishant
相关产品推荐
相关产品推荐

