Azure Data Factory复制活动字符串数组映射Cosmos SQL Sink报错问题
问题根因
这是Azure Data Factory Copy Activity的已知默认限制:当你直接将管道变量作为源字段参与映射时,Copy Activity的映射层默认仅支持传递字符串、数字、布尔等标量类型,会默认将数组、对象等复合类型尝试转换为字符串,无法直接匹配Sink端的数组类型定义,所以会抛出你遇到的类型转换错误。
可行解决方案
方案1:使用Mapping Data Flow替代Copy Activity(最推荐)
数据流原生支持复合类型操作,操作步骤如下:
- 在数据流中添加你的JSON源,同时可以通过参数将管道的数组变量传递到数据流中
- 添加「派生列」组件,定义
accessGroups字段为传入的数组参数,类型显式设置为Array(String) - 直接将派生的
accessGroups字段映射到Cosmos Sink的对应数组字段即可,不会出现类型转换问题
方案2:Copy Activity结合Cosmos自定义写入脚本(无需更换组件)
如果你必须保留Copy Activity的配置,可以通过序列化+反序列化的方式绕过限制:
- 首先将管道中的数组类型
accessGroups变量通过ADF内置的json()函数序列化为JSON字符串,作为字符串类型字段映射到Sink的accessGroups字段 - 打开Cosmos Sink的「设置」选项卡,找到「写入行为」配置,选择使用自定义预写入脚本,添加如下逻辑:
function processItem(item) { item.accessGroups = JSON.parse(item.accessGroups); return item; }
- 保存配置后运行任务即可正常写入数组类型字段
方案3:合并变量到源JSON结构
将管道变量中的accessGroups数组直接合并到你的源JSON文件的结构中,不要作为单独的管道变量传递。Copy Activity对JSON源中自带的数组字段识别和映射能力是完整的,只要源Schema导入后将accessGroups类型定义为Array(String),直接映射到Sink的同类型字段即可正常传递。
内容的提问来源于stack exchange,提问作者Gowthaman Prabhu
相关产品推荐
相关产品推荐

