如何在ADF中为多不同Schema的Excel工作表定义数据集Schema?
问题
计划使用ADF复制活动将ADLS中的Excel文件复制到Synapse Data Warehouse,该Excel包含多个Schema和列名不同的工作表,工作表列表通过参数传入ADF管道处理。
未定义或映射Schema时触发复制活动,出现如下错误:
ErrorCode=DelimitedTextColumnNameNotAllowNull,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=The name of column index 1 is empty. Make sure column name is properly specified in the header row.,Source=Microsoft.DataTransfer.Common
已完成以下排查:
- 确认Excel所有列均有名称,首行无空单元格,列名无逗号、空格或特殊字符;
- 源数据集为Excel类型(非CSV);
- 已启用“首行作为标题”选项;
- 通过ADF“预览数据”可正常查看数据,列名与源文件一致;
- 单独为每个工作表导入Schema均正常,但因工作表Schema不同,无法统一处理。
需求:如何为每个Schema不同的Excel工作表定义对应Schema并完成复制?
解决方案
针对多Schema工作表的处理,可通过参数化数据集+动态Schema映射结合ForEach循环实现,具体步骤如下:
1. 创建参数化的Excel源数据集
在Excel源数据集中添加参数SheetName,用于动态指定当前处理的工作表名称:
- 打开Excel源数据集,进入“参数”选项卡,添加字符串类型参数
SheetName; - 在“连接”选项卡的“工作表名称”处,选择“动态内容”,引用该参数
@dataset().SheetName。
2. 为每个工作表配置专属Schema映射
方式一:预定义Schema映射(适合工作表数量固定的场景)
- 为每个不同Schema的工作表单独创建Schema映射JSON文件(存储在ADLS中),文件内容示例:
{ "columnMappings": [ {"sourceName": "ID", "sinkName": "ID", "dataType": "int"}, {"sourceName": "Name", "sinkName": "Name", "dataType": "varchar(50)"} ] }
- 在管道中添加Lookup活动,根据当前工作表名称动态读取对应的Schema映射文件,将结果存储在变量中。
方式二:动态获取Schema(适合工作表数量不固定的场景)
- 使用Lookup活动读取当前工作表的前几行数据,开启
firstRowAsHeader获取列名; - 结合ADF表达式函数(如
createArray、addProperty)动态生成源-目标列映射关系,需确保Synapse目标表已提前创建对应Schema的表。
3. 配置ForEach循环批量处理工作表
- 在管道中添加ForEach活动,遍历传入的工作表列表参数;
- 在ForEach内部添加复制活动:
- 源数据集选择参数化的Excel数据集,将当前循环项赋值给
SheetName参数; - 目标数据集选择Synapse Data Warehouse,动态指定目标表名(建议与工作表名称对应);
- 在复制活动的“映射”选项卡,使用动态内容引用之前获取的Schema映射(或直接生成的映射表达式),实现每个工作表对应专属的Schema映射。
- 源数据集选择参数化的Excel数据集,将当前循环项赋值给
4. 错误规避补充
- 确保Synapse目标表的Schema与对应工作表完全匹配,或根据业务需求开启复制活动的“允许Schema漂移”功能;
- 若仍出现列名空值错误,可在复制活动源的“高级”选项中设置
skipEmptyRows为true,并检查工作表是否存在隐藏列或格式异常的单元格。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

