Informatica中按Col1分组计数后基于Col3值过滤数据的方法
Informatica需求实现方案
实现逻辑说明
先按Col1维度统计每个值对应的明细行数,对行数≥2的分组仅保留Col3='Y'的记录,行数=1的分组保留全部记录,完全匹配需求规则。
方法一:通用组件实现(适配所有源类型,无需源库支持特殊语法)
Mapping数据流按以下步骤搭建即可:
- 拖入源组件读取业务数据,输出
Col1、Col2、Col3三个原始字段,从源组件分两路输出数据流 - 第一路数据流直接接入Joiner组件作为明细数据流,保留所有原始字段不做处理
- 第二路数据流接入Aggregator聚合组件:
- 勾选
Col1字段的Group By选项,作为分组键 - 新增输出端口
cnt_group,端口表达式配置为COUNT(*),用于统计每个Col1分组的行数 - 聚合组件仅输出
Col1、cnt_group两个字段,接入Joiner组件作为主数据流(聚合后的数据量远小于明细,做主流关联性能更高)
- 勾选
- 配置Joiner组件:
- 关联条件设置为两路数据流的
Col1字段相等 - 关联类型选择内连接即可,两路数据同源不会出现匹配不上的情况
- 关联后输出所有原始字段+分组计数字段
cnt_group
- 关联条件设置为两路数据流的
- Joiner后接入Filter过滤组件,过滤条件配置为:
(cnt_group >= 2 AND Col3 = 'Y') OR cnt_group = 1 - Filter输出的结果就是最终符合要求的数据,直接接入目标组件即可。
方法二:Source Qualifier直推实现(适配关系型源库,性能更高)
如果源是Oracle、MySQL、PostgreSQL这类支持窗口函数的关系型数据库,可以不用搭建聚合、关联组件,直接在Source Qualifier里写自定义查询SQL,一步完成分组计数:
SELECT Col1, Col2, Col3, COUNT(*) OVER(PARTITION BY Col1) AS cnt_group FROM 源表名
SQL输出后直接接Filter组件,过滤条件和方法一完全一致即可,链路更短,大数据量下性能比多组件关联好很多。
样例数据运行结果
用给出的测试数据跑上述流程,最终输出结果如下:
Col1 Col2 Col3 45321_320 A Y 76453-10 A Y 45638_80 A Y
避坑提示
- Aggregator组件不要漏选Col1的Group By勾选,否则会把所有数据当成一个组计数,结果完全错误
- Joiner组件不要选成外连接,会产生不必要的空值数据
- Filter条件不要漏写
cnt_group=1的分支,否则会把单条记录的分组全部过滤掉
内容的提问来源于stack exchange,提问作者snigh4326
相关产品推荐
相关产品推荐

