我正在尝试将大量数据从一个数据库导入到另一个数据库(从MSSQL到MySQL)。转换的过程是这样的:获取数据的子集,通过检查哈希来检查它是更新还是插入,映射数据并通过API调用将其插入MySQL DB。目前的子集部分完全是手动的,有没有一种方法可以让Pentaho替我做,一种迭代。我用来获取子集的查询是
select t1.*
from (
select *, ROW_NUMBER() as RowNum over (order by id)
from mytable
) t1
where RowNum between @offset and @offset + @limit;
PDI是否可以设置偏移量并重复整个偏移量?
谢谢
您可以(尽管有警告)在父作业中创建循环,在Javascript步骤的每次迭代中都增加偏移量变量。我使用了这样的设置来使用结果数量未知的Web服务,每次获取整页后都偏移偏移量,而当获取的页面较少时停止偏移量。
设置变量
在作业属性中,定义参数Offset和Limit,因此您可以从任何偏移开始(重新)启动,甚至可以从命令行以特定的offset和Limit调用作业。也可以使用变量步骤来完成,但是参数可以做所有相同的事情,而且您可以设置测试的默认值。
转换中的处理
主要转换应启用“将参数值传递给子转换”,这是默认设置。
在转换内部(请参见图像的下半部分,您从使用变量替换的表输入开始,将$ {Offset}和$ {Limit}放在@offset和@limit的位置。
然后,来自表输入的流将进行处理,但还将复制到Group By步骤以对行进行计数。将组字段保留为空,并创建一个对所有行进行计数的字段。选中该框可始终返回结果行。
将流从“分组依据”发送到“设置变量”步骤,并在父作业的范围内设置NumRows变量。
后退
在主要工作中,从转换转到简单评估步骤,以将NumRows变量与Limit相比较。如果NumRows小于$ {Limit},则说明您已经到了最后一批,成功!
如果不是,请执行Javascript步骤以增加偏移量,如下所示:
var offset = parseInt(parent_job.getVariable("Offset"),0);
var limit = parseInt(parent_job.getVariable("Limit"),0);
offset = offset + limit;
parent_job.setVariable("Offset",offset);
true;
然后,工作流程进入虚拟步骤,然后使用新的偏移值再次进行转换。
[Notes