Pentaho 数据集成 从数据库导入大型数据集
Posted
技术标签:
【中文标题】Pentaho 数据集成 从数据库导入大型数据集【英文标题】:Pentaho Data Integration Import large dataset from DB 【发布时间】:2019-10-29 23:12:40 【问题描述】:我正在尝试将大量数据从一个数据库导入到另一个数据库(从 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 设置偏移量并重申整体?
谢谢
【问题讨论】:
【参考方案1】:您可以(尽管有警告)在父作业中创建一个循环,在 javascript 步骤中的每次迭代中递增偏移量变量。我已经使用这样的设置来使用具有未知数量结果的 web 服务,每次获得完整页面后都会移动偏移量,并在获得更少结果时停止。
设置变量
在作业属性中,定义参数 Offset 和 Limit,以便您可以(重新)从任何偏移量开始,甚至可以从具有特定偏移量和限制的命令行调用作业。也可以通过变量步骤来完成,但参数的作用相同,而且您可以设置测试的默认值。
转换中的处理
默认情况下,主转换应启用“将参数值传递给子转换”。
在转换内部(参见图像的下半部分),您从使用变量替换的表输入开始,将 $Offset 和 $Limit 放在您有 @offset 和 @limit 的位置。
然后来自表输入的流进入处理,但也被复制到 Group By 步骤以计算行数。将组字段留空并创建一个对所有行进行计数的字段。选中该框以始终返回结果行。
将流从 Group By 发送到 Set Variables 步骤,并在父作业范围内设置 NumRows 变量。
循环返回
在主要工作中,从转换转到简单评估步骤,将 NumRows 变量与 Limit 进行比较。如果 NumRows 小于 $Limit,则您已到达最后一批,成功!
如果没有,请继续执行 Javascript 步骤以增加 Offset,如下所示:
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;
然后,作业流程进入虚拟步骤,然后使用新的偏移值再次进行转换。
备注
与转换不同,您可以在同一个作业中设置和使用变量。 JS 步骤需要“true;”作为最后一条语句,因此它报告作业成功。【讨论】:
感谢分析器并为迟到的答案感到抱歉,但不知何故我错过了通知。我将尝试您建议的方式并通知您。以上是关于Pentaho 数据集成 从数据库导入大型数据集的主要内容,如果未能解决你的问题,请参考以下文章
从结果集中获取行并在 Pentaho 数据集成中使用获取变量
Pentaho 数据集成转换,从 csv 文件加载字段(Java API)
在 Pentaho 数据集成中将字段从 String 更改为 Int