Informatica PowerCenter如何为重复源记录打Flag实现SCD2加载
Informatica PowerCenter 实现连续Code标记及SCD2加载方案
核心实现逻辑是通过排序保证分组顺序,再用Expression转换的变量端口逐行缓存上一条记录的分组键和Code值,对比后完成Flag标记,整体映射流程如下:
- 源表(Source)→ Sorter转换 → Expression转换 → Filter转换 → SCD2加载逻辑 → 目标表(Target)
步骤1:配置Sorter转换保证分组顺序
将Sorter转换连接源表输出,排序规则根据业务要求选择:
- 如果按源端原始传入顺序判断连续Code(和你给出的示例逻辑一致):若源是平面文件可直接保留读取顺序,若源是数据库需提前在源查询中加排序字段保证记录顺序符合预期,仅添加
Number作为排序键升序即可,保证同一Number的记录归为一组。 - 如果按时间先后判断连续Code:设置两个排序键,先按
Number升序,再按Date升序,同分组内记录按时间排列。
步骤2:配置Expression转换完成Flag标记
这一步是核心,注意变量端口的顺序不能调换(Informatica按端口从上到下的顺序逐行计算变量),端口配置如下:
- 先引入3个输入端口,映射Sorter输出的对应字段:
in_Number:匹配源Number字段类型in_Code:匹配源Code字段类型in_Date:匹配源Date字段类型
- 新增3个变量端口(Variable Port,仅内部计算不输出):
v_Flag:整数类型,表达式配置为IIF(in_Number = v_PREV_NUMBER AND in_Code = v_PREV_CODE, 2, 1)v_PREV_NUMBER:和in_Number同类型,默认值保留NULL,表达式配置为in_Numberv_PREV_CODE:和in_Code同类型,默认值保留NULL,表达式配置为in_Code
- 新增4个输出端口,映射到下游转换:
out_Number:表达式为in_Numberout_Code:表达式为in_Codeout_Date:表达式为in_Dateout_Flag:整数类型,表达式为v_Flag
步骤3:配置Filter转换筛选变更记录
将Filter转换连接Expression输出,过滤条件设置为 out_Flag = 1,即可仅保留每个连续Code分段的首条记录,也就是Code发生变更的记录。
步骤4:对接SCD2加载逻辑
筛选出的变更记录直接对接现有SCD2类型2加载流程即可:通过Update Strategy转换标记新旧版本,将同Number下旧版本记录的截止日期、有效标识更新为失效,再插入新版本记录,写入生效起始日期、有效标识为有效,完成维度拉链表加载。
逻辑验证
按你给出的原始输入顺序计算,Flag结果和示例完全匹配(你提供的输出示例漏了1234,4,2022/01/28这条Flag=1的记录):
Input Number Code Date 1234 3 2022/01/22 1234 3 2022/01/23 1234 4 2022/01/24 1234 3 2022/01/25 1234 3 2022/01/26 1234 2 2022/01/27 1234 4 2022/01/28 4567 1 2022/01/29 4567 1 2022/01/20 4567 3 2022/01/21 Output Number Code Date Flag 1234 3 2022/01/22 1 1234 3 2022/01/23 2 1234 4 2022/01/24 1 1234 3 2022/01/25 1 1234 3 2022/01/26 2 1234 2 2022/01/27 1 1234 4 2022/01/28 1 4567 1 2022/01/29 1 4567 1 2022/01/20 2 4567 3 2022/01/21 1
注意事项
- 变量端口顺序不能调整:必须先计算
v_Flag,再给两个缓存变量v_PREV_NUMBER、v_PREV_CODE赋值,否则会出现当前行和自身对比的问题,导致所有Flag都被标记为1。 - 不要手动修改变量端口的默认值,保留初始NULL即可,第一条记录进入时缓存值为NULL,会被正确标记为分组首条。
- 如果任务开启分区,必须保证同一个
Number的所有记录被分配到同一个分区,否则跨分区缓存不互通会导致Flag计算错误,可设置按Number做哈希分区。
内容的提问来源于stack exchange,提问作者Satish Varadha
相关产品推荐
相关产品推荐

