Pentaho:只有在没有重复的情况下才执行插入

时间:2015-03-05 09:26:19

标签: pentaho kettle pdi

基本上我只想在目标行没有变化的情况下插入一组行。

我已经实现了一个阻塞步骤,等待处理所有行,然后再继续。在此之后,我想添加一个条件来检查是否有任何更改的数据,如果有任何中止,则进程会插入所有行。

有什么建议吗?

4 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你想要插入与目标行相同的行吗?这不会导致PK违规吗?

无论如何,从您的代码截屏开始,您似乎使用了合并行(差异)步骤,该步骤将为您提供标记为“新”,“已更改”,“相同”或“已删除”状态的行。 从这里你想要检查两件事:改变或相同

如果更改,则必须中止,如果相同,则插入

现在你使用一个简单的过滤步骤,其中status ='same'作为真实条件(即)在你的情况下插入流程

错误的情况会进入中止步骤。

虽然注意到即使发现一行被改变,整个转换也会被中止

答案 1 :(得分:0)

如果我理解你的用例,我不会使用“表输出”步骤进行此类移动。 “表输出”是数据仓库的一个很好的步骤,您通常会将数据插入到应该为空的表中,并且是更广泛流程的一部分。

或者,我会使用“执行SQL脚本”来根据您自己的需要调整INSERT。 考虑这是您想要的SQL语句(本例中为PostgreSQL语法):

INSERT INTO ${TargetTable}
    (contact_id, request_id, event_time, channel_id)
VALUES ('?', '?', '?', '?')
WHERE
    NOT EXISTS (
        SELECT contact_id, request_id, event_time, channel_id FROM ${TargetTable} 
        WHERE contact_id = '?' AND 
        -- and so on...
    );

  1. 获取映射所需的字段(将通过问号引用到参数序列中);
  2. 如果您打算使用在更广泛的流程中加载和/或创建的变量,请选中“变量替换”复选框;
  3. step snapshot

    SQL性能方面,它可能不是最有效的方式,但它看起来像是一个更好的实现用例。

答案 2 :(得分:0)

这似乎很容易,只需两步

试试这个: 步骤1:使用数据库查找步骤,查找关键列,并检索要比较的列,包括目标表中重复项的关键字段。

步骤2:使用过滤器步骤,此处将您从db look中检索到的所有字段与stream / table / source输入进行比较。像id(来自源输入)= id(来自目标)和名称(来自源输入)= name(来自目标),false条件指向Target表,而true表示虚拟测试。

注意:如果要填充表格键max + 1,则需要组合查找和更新步骤而不是表格输出

答案 3 :(得分:0)

最简单的方法是使用插入/更新步骤。不需要进行任何查询:如果该行存在则更新,如果不存在则创建新行。