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 数据集成 - 从字符串中提取字符串

Pentaho 数据集成转换,从 csv 文件加载字段(Java API)

在 Pentaho 数据集成中将字段从 String 更改为 Int

Pentaho 数据集成 Google BigQuery Loader 异常

使用 pentaho 数据集成的 SQL 标识列插入