如何使用ADF Data Flow过滤数组值及配置问题排查
问题描述
有多份JSON文件,需对其中distributionReason[]数组进行值过滤,目标是当数组中存在code匹配指定值的元素时,将完整的根节点record输出到Sink。当前在ADF Data Flow的Filter和Sink环节遇到问题:
- Filter环节尝试的条件因数组结构无法生效
- Sink环节看不到根节点
record的内容,无法输出完整记录
示例JSON结构:
{ "record": { "ns": "meta", "type": "SW", "metadata": { "markings": { "ns": "meta", "redactableData": { "ns": "meta", "distributionReasons": { "ns": "meta", "distributionReason": [ { "num": "1", "ns": "meta", "code": "SW", "description": "SW value" } ] } } } } } }
当前Data Flow配置:
- Source:已配置对应数据源
- Derived Column 1:衍生字段
record和distributionReasons,其中distributionReasons取值为record.metadata.markings.redactableData.distributionReasons - Flatten 1:设置Unroll by为
record.metadata.markings.redactable.distributionReasons(路径存在拼写错误,应为redactableData) - Filter:尝试过
distributionReasons.distributionReason.code == 'SW'和contains(distributionReasons.distributionReason.code,#item == 'SW'),均因数组结构无法生效 - Sink:无法在Input Columns中找到根节点
record,无法输出完整记录
解决方案
1. 简化转换流程,无需Flatten转换
因为目标是保留完整根record,只需判断数组中是否存在符合条件的元素,不需要展开数组,可直接跳过Derived Column和Flatten步骤。
2. 正确配置Filter条件
使用ADF Data Flow的exists()函数判断数组中是否存在符合条件的元素,条件表达式如下:
exists(record.metadata.markings.redactableData.distributionReasons.distributionReason, #item.code == 'SW')
exists()函数接收两个参数:第一个是目标数组的完整路径,第二个是元素判断逻辑(#item代表数组中的单个元素)- 该表达式会检查
distributionReason数组中是否存在code等于'SW'的元素,存在则保留当前完整记录
3. 配置Sink输出完整根record
- 在Sink转换的Settings标签页,将Output format设置为
JSON - 在Mapping标签页,选择Auto map,确保根节点
record被自动映射;若Auto map未包含,手动添加映射:将输入列的record直接映射到输出字段 - 若需要完全保留原始JSON嵌套结构,可在Sink的Settings中开启Preserve hierarchy选项
内容的提问来源于stack exchange,提问作者thichxai
相关产品推荐
相关产品推荐

