ADF复制ADLS中CSV到Synapse专用SQL池时报列数超出预期错误
问题根因
ADF分隔符文本读取逻辑默认以架构导入阶段探测到的首行列数作为固定列数校验基准,当前SALESLINE表复制失败触发DelimitedTextMoreColumnsThanDefined报错的核心原因有两点:
- D365 F&O导出的无表头CSV本身存在行级列数不一致问题,第4、6行超出默认探测的6列长度,本质是字段值中存在未转义的分隔符(常见为字段值携带逗号、换行符,导出环节未做引号包裹处理)
- 未基于salesline.CDM.json存储的官方元数据定义源架构,依赖ADF自动探测首行生成的schema列数和实际文件最大列数不匹配
排查步骤
- 下载报错对象
SALESLINE_00001.csv,定位到第4、6行,检查额外字段来源:确认是否为备注、地址、描述类自由文本字段中携带CSV分隔符(默认逗号)但未转义,统计单条记录实际最大列数 - 提取salesline.CDM.json中定义的SALESLINE表全量字段清单,和当前ADF源数据集配置的列数做比对,确认是否存在schema配置漏配字段
- 检查D365 F&O导出至ADLS的任务配置,确认是否开启CSV特殊字符转义、字段值引号包裹选项,定位导出环节的格式异常原因
解决方法
按落地优先级从高到低选择对应方案:
- 源头修复导出格式问题
调整D365 F&O导出至ADLS的CSV写入规则,开启字段值引号包裹、特殊字符(分隔符、换行符)转义配置,从源头避免单行列数与schema定义不一致的问题。修复后导出的文件可直接匹配CDM.json定义的字段结构,无需在ADF侧额外做兼容配置。 - 调整ADF侧读取规则适配现有文件
若暂时无法修改导出侧配置,在ADF的CSV源数据集配置中做如下调整:- 弃用「首行探测自动生成schema」逻辑,手动导入salesline.CDM.json中定义的全量字段作为源schema,列数与CDM定义保持一致
- 在源数据集连接配置的分隔符文本设置项中,将列数不匹配的处理规则调整为:超出定义列数的字段值自动合并至最后一列,或直接忽略多余列
- 配置完成后重新生成复制活动的列映射,确保源字段与Synapse专用SQL池目标字段一一对应
- 临时快速验证方案
在复制活动源配置中将整个CSV按单一大字段读取,不做初始列拆分,后续通过ADF数据流或Synapse T-SQL结合CDM.json的字段定义完成字段拆分、异常行清洗后再写入目标表。该方案不会触发列数校验报错,但处理链路更长,仅适合临时排障验证使用。
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

