如何在Azure Data Factory数据流中动态拆分多值housenumber列
Azure Data Factory 跨行多值门牌号字段处理解决方案
问题修复核心思路
先完成跨行同主键数据的合并清洗,再用数组展开替代手动建列,自动适配任意数量的门牌号值,同时兼容后续透视与接收器转换。
具体实现步骤
步骤1:合并跨行数据并标准化清洗(解决拆分不符合预期问题)
- 首先添加聚合转换:分组键设置为
Id、Person两列,新增聚合字段merged_housenumber,表达式为concatWS(',', collect(housenumber)),将同一个主键关联的所有跨行门牌号内容拼接为单个字符串 - 新增派生列转换:
- 先清洗非法字符,生成
cleaned_housenumber,表达式为replace(replace(replace(merged_housenumber, '、', ','), '\n', ''), ' ', ''),统一分隔符为半角逗号,去除换行、空格、顿号等干扰字符 - 拆分生成数组:
housenumber_arr = filter(split(cleaned_housenumber, ','), #item != ''),过滤掉拆分产生的空值元素
- 先清洗非法字符,生成
步骤2:数组扁平化展开(解决手动建列维护成本高问题)
直接添加扁平化(Flatten)转换,输入端接上述派生列输出:
- 选择
housenumber_arr作为要展开的数组字段 - 展开后自动为每个门牌号生成独立行,每行保留原有
Id、Person字段,新增单个门牌号字段可命名为single_housenumber - 该转换可自动适配任意数量的门牌号值,不管是10个还是100个都无需调整规则,零维护成本
步骤3:对接透视与接收器转换
如果需要将行级门牌号转为多列格式输出,在扁平化转换后新增透视转换即可:
- 分组键选择
Id、Person - 提前在派生列中新增序号字段:
house_seq = concat('house_', toString(rowNumber() over(partition by Id, Person order by single_housenumber))),用于生成透视后的列名 - 透视键选择
house_seq字段,聚合表达式设置为first(single_housenumber) - 透视转换会自动生成匹配最大门牌号数量的
house_1、house_2...列,无需手动定义 - 透视后的输出直接对接接收器转换即可写入目标库或文件,适配所有支持的sink类型
内容的提问来源于stack exchange,提问作者amikm
相关产品推荐
相关产品推荐

