Pentaho数据集成从数据库导入大数据集

问题描述 投票:1回答:1

我正在尝试将大量数据从一个数据库导入到另一个数据库(从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是否可以设置偏移量并重复整个偏移量?

谢谢

pentaho pdi data-integration
1个回答
0
投票

您可以(尽管有警告)在父作业中创建循环,在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

  • 与转换不同,可以在同一作业中设置和使用变量。
  • JS步骤需要为“ true;”作为最后一条语句,因此它报告工作成功。

screenshot of looped job and transformation

© www.soinside.com 2019 - 2024. All rights reserved.