启用变量替换时PDI的Merge rows (diff)步骤未执行求助
PDI中Merge Rows (Diff)结合带参数的Table Input+Sort步骤无输出的问题分析
问题场景
- 在Pentaho Data Integration(PDI)转换中,使用
Merge rows (diff)步骤对比两个Table Input返回的数据集,每个Table Input后都串联了Sort步骤做排序 - 因为
Table Input的查询需要动态传入参数,开启了Replace variables in script?、Insert data from step和**Execute for each row?**三个选项 - 当硬编码参数值、关闭上述选项时,
Merge rows (diff)能正常工作,正确标记行的new/changed等状态;但启用参数选项后,后续的Write to log无输出,排查发现Sort步骤没有返回数据 - 将
Sort步骤替换为Table Input查询内的ORDER BY子句后,Merge rows (diff)开始接收并输出数据(注:实际输出行数不符的问题不在本次讨论范围内)
原因分析
Sort步骤的工作逻辑是对完整的输入数据集做全局排序,但当Table Input开启Execute for each row?时,会为上游每一行数据单独执行一次查询,返回的是多个独立的小数据集,而非一个整体数据集Sort步骤无法处理这种多批次的零散输出,导致没有数据传递到后续的Merge rows (diff),最终出现无输出的情况Merge rows (diff)本身要求两个输入数据集必须是全局有序的,但Sort步骤的单批次排序模式,和Execute for each row?的多批次查询输出不兼容
解决方案
- 优先在
Table Input的SQL查询中添加ORDER BY子句,让数据库直接返回有序数据集,跳过PDI的Sort步骤,避免多批次数据的排序问题 - 如果必须使用
Sort步骤,关闭Table Input的Execute for each row?选项,改用转换参数/全局变量传递参数,确保Table Input返回单一完整数据集后再执行排序 - 若业务需求必须逐行执行查询,先使用
Union all步骤将所有查询返回的小数据集合并为一个完整数据集,再通过Sort步骤排序,最后传入Merge rows (diff)进行对比
内容的提问来源于stack exchange,提问作者rmeneses
相关产品推荐
相关产品推荐

