【问题标题】:Pentaho Data Integration Import large dataset from DBPentaho 数据集成 从数据库导入大型数据集
【发布时间】: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 设置偏移量并重申整体?

谢谢

【问题讨论】:

    标签: pentaho pdi data-integration


    【解决方案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;”作为最后一条语句,因此它报告作业成功。

    【讨论】:

    • 感谢分析器并为迟到的答案感到抱歉,但不知何故我错过了通知。我将尝试您建议的方式并通知您。
    猜你喜欢
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多