如何在Azure Data Factory复制活动中从层级JSON过滤映射数组到表格文件?
解决Azure复制活动中过滤多语言本地化数组的问题
核心结论
复制活动的映射环节可以直接提取指定语言(nl-NL)的值,但你之前使用filter的语法有误,需要调整为正确的动态表达式逻辑。如果只是提取单语言字段值,无需先保存为JSON再用数据流;但如果要做数组展开、多维度结构转换等复杂操作,数据流会更便捷。
正确的动态表达式写法
你之前的错误在于:filter函数第一个参数必须是完整数组,第二个参数需用item()指代数组项来编写判断逻辑。以下是针对各字段的具体实现:
1. 提取stage的nl-NL翻译值
兼容数组为空或无匹配项的场景:
@if(empty($['stage']['localization']), null, first(filter($['stage']['localization'], item()['locale'] == 'nl-NL'))['value'])
2. 提取disqualifyReason的nl-NL翻译值
因disqualifyReason可能为null,需先做非空判断:
@if(equals($['disqualifyReason'], null), null, if(empty($['disqualifyReason']['localization']), null, first(filter($['disqualifyReason']['localization'], item()['locale'] == 'nl-NL'))['value']))
3. 提取source.media.title的nl-NL翻译值
针对深层嵌套数组:
@if(empty($['source']['media']['title']['localization']), null, first(filter($['source']['media']['title']['localization'], item()['locale'] == 'nl-NL'))['value'])
特殊场景处理
如果同一locale存在多个值(比如示例第三条数据的stage有两个nl-NL条目),first只会取第一个值。若需合并所有匹配值,可改用join+map:
@if(empty($['stage']['localization']), null, join(map(filter($['stage']['localization'], item()['locale'] == 'nl-NL'), item()['value']), ', '))
复制活动与数据流的适用边界
- 仅提取单语言字段值:用复制活动映射的动态表达式即可完成,无需额外步骤
- 需展开数组为多条记录、多维度过滤或复杂结构转换:建议用数据流活动,支持完整的数组操作、ETL转换能力,操作更直观
内容的提问来源于stack exchange,提问作者TTub
相关产品推荐
相关产品推荐

