Databricks使用spark.read.csv读CSV时无法正常识别列头问题
问题根因
该类CSV列头识别错位问题,本质是Spark与Azure Synapse的CSV默认解析规则不匹配:
- 从输出的schema特征判断,目标CSV文件开头存在3行导出工具自动追加的元数据行(分别为UUID、导出时间类信息),并非业务表真实表头。Synapse内置解析器会自动跳过这类前置无意义元数据,但Spark默认从文件首行开始解析,即使配置
header=True也会将首行元数据识别为表头,后续数据行错位后,无法匹配表头的字段会被自动命名为_c5、_c6这类默认列名。 - 若跳过前置行后列名仍存在乱码、拆分错误,是因为文件分隔符、编码与Spark默认配置不符:Spark默认使用逗号作为分隔符、UTF-8无BOM编码,若文件为制表符/分号分隔、GBK编码、或带UTF-8 BOM头,也会导致表头解析失败。
修复步骤
- 定位真实表头行位置
先以纯文本格式读取文件前10行,确认需要跳过的冗余元数据行数:# 输出前10行原始内容,找到真实业务表头所在行 spark.read.text("/mnt/syn/account/2018-06.csv").show(10, truncate=False) - 传入正确参数读取CSV
根据上一步查到的冗余行数配置skipRows参数,同时按需指定分隔符、编码配置:acct = spark.read.csv( path="/mnt/syn/account/2018-06.csv", header=True, inferSchema=True, skipRows=3, # 替换为实际需要跳过的前置元数据行数 # sep="\t", # 制表符分隔文件放开此配置 # encoding="GBK", # GBK编码文件放开此配置 # charset="UTF-8-BOM" # 带BOM头的UTF-8文件放开此配置 ) - 结果校验
读取完成后先执行acct.printSchema()确认列名正常,再执行acct.show(5)校验数据与字段是否对齐,确认无误后再开展后续处理。
优化建议:大文件场景不建议开启
inferSchema,该配置会扫描全量数据推断字段类型,性能损耗极高。列名对齐后建议手动定义StructType schema传入,读取稳定性和执行效率都会明显提升。
内容的提问来源于stack exchange,提问作者Patterson
相关产品推荐
相关产品推荐

