我是Pentaho Spoon的新手,我想将csv文件的记录导入数据库表。但是,只应将唯一记录导入数据库表。这就是为什么我需要将EACH记录与数据库表的所有记录进行比较,以确定是否应该导入记录。
正如你在图片中看到的,我合并了excel输入和表输入(忽略了cast-steps。我需要转换一个值因为float格式不同:数据库格式是#.000000和csv float的格式是#.0)
在合并连接之后,我比较了标志(由合并行(diff)给出,如果比较记录是新的,我将它们导入数据库表,如果它们被更改,我更新记录,如果它们被删除或相同,我什么都不做。到目前为止,这么好。
但问题是:如果我将csv-input-file的记录随机重新运行并重新运行转换,则会重新导入所有记录,因此,我的数据库表中存在重复(我想避免) 。再次强调:解决这个问题的正确方法是将csv-input-file的每一行与数据库表中的所有条目进行比较。
我怎么能意识到这一点?有什么建议?非常感谢你提前!!
答案 0 :(得分:0)
Merge Rows (diff)
期望输入被排序。通常情况下,弹出窗口会警告您。
在Excel输入的输出流程到达Sort rows
之前放置一个Merge Rows (diff)
步骤。
您应该在Table Input
和Merge Rows (diff)
之间执行相同的操作。当然,您可能认为可以在Table Input
的
然而,这里有一个初学者陷阱。您还有3个其他步骤Output Rows
,Update
和Delete
,它们在同一个表上运行。而这些步骤可能会锁定表格。在Kettle中,所有步骤同时运行,您不知道哪个步骤将首先触发,并且表可能被锁定,甚至无法读取第一条记录。这在行话中称为 自动锁定 ,解决方法是将Sort Row
步骤作为 缓冲区 强>
答案 1 :(得分:0)
您可以使用“维度查找/更新”控件,该控件提供您尝试实现的相同功能。
谢谢, Nilesh制作