如何在Informatica中实现跨作业的App id关联唯一序列生成?
要实现每次运行作业时,对相同App id+原始App name的记录延续之前的计数生成带序号的名称,核心是持久化历史计数,再结合当前运行的记录进行序号分配。下面是具体的落地方案:
1. 先准备持久化存储(历史计数表)
首先得在数据库里建一张历史计数表,用来存每个App id+原始App name对应的最新序号,结构可以这么设计:
CREATE TABLE app_seq_history ( app_id VARCHAR(50), original_app_name VARCHAR(100), last_seq_num INT, PRIMARY KEY (app_id, original_app_name) );
这张表会在每次作业跑完后更新,牢牢记住当前最大的序号值,确保下次运行能接着计数。
2. 映射设计分步走
(1)读取源数据
用Informatica的源定义读取你的输入数据(不管是文件还是数据库表),注意此时的App name是不带后缀的原始值(比如abc、cde)。如果源数据里已经带了后缀,得先用表达式转换提取原始名称,比如用REGEXP_SUBSTR(app_name, '^[^-]+')去掉-数字部分。
(2)查找历史序号
加一个查找转换(Lookup Transformation),关联刚才建的app_seq_history表,关联条件是源.app_id = 历史表.app_id且源.original_app_name = 历史表.original_app_name:
- 找到匹配记录就取出
last_seq_num作为起始序号; - 没找到(首次出现的App组合)就设默认值为
0。
(3)生成当前批次的组内序号
加一个聚合转换(Aggregator Transformation),按app_id和original_app_name分组,给当前批次里的同组记录分配临时序号,用表达式:
ROW_NUMBER() OVER (PARTITION BY app_id, original_app_name ORDER BY app_id)
这个端口会给同组的记录生成1、2、3...的临时序号,比如首次运行里的两个123-abc,临时序号就是1和2。
(4)计算最终序号并生成新名称
加一个表达式转换(Expression Transformation),先算最终序号:
final_seq = ISNULL(lookup_last_seq_num, 0) + current_batch_seq
再拼接出新的App name:
new_app_name = original_app_name || '-' || final_seq
(5)更新历史计数表
再用一个聚合转换算出当前批次里每个App id+original_app_name组的最大final_seq,接着用**更新策略转换(Update Strategy Transformation)**对历史表执行UPSERT操作:
- 历史表已有该组合,就把
last_seq_num更新成当前批次的最大final_seq; - 没有的话就插入新记录,
last_seq_num设为当前批次的最大final_seq。
(6)输出结果
最后用目标定义把包含App id和new_app_name的记录输出到目标文件或表,就能得到你要的格式了。
3. 运行逻辑验证
- 首次运行:历史表是空的,所有
lookup_last_seq_num都是0。同组记录的临时序号是1、2,所以最终序号是1、1、2,生成abc-1、cde-1、abc-2,同时历史表更新为(123, abc, 2)和(456, cde, 1)。 - 第二次运行:查找历史表得到
123-abc的last_seq_num是2,456-cde是1。当前批次的临时序号还是1、2,所以最终序号是2+1=3,1+1=2,2+2=4,生成abc-3、cde-2、abc-4,历史表更新为(123, abc, 4)和(456, cde, 2),完全匹配需求。
小提醒
要开启Informatica的事务控制,避免作业中途失败导致历史表数据乱掉,保证计数的准确性。
内容的提问来源于stack exchange,提问作者Rohit

