一、问题描述
正在处理的迁移需求是,将一张表的数据完整导出到两张表中,因为数据量较大,每个表输出转换控件又修改了“复制的数量”这一参数,可以理解为线程数。
运行转换脚本,报错:
同样的数据被插入多次,违反目标表的唯一约束,当“复制的数量”>1就会出现该问题。
二、原因分析
跳(Hop)
跳是步骤之间带箭头的连线,跳定义了步骤之间的数据通路。
当一个输入控件对应多个输出控件时,会要求选择跳的类型,跳有两种形式,“分发”和“复制”
- 分发记录:目标步骤轮流接受记录
- 复制记录:所有的记录被同时发送到所有的目标步骤
我这里是一个表的数据要导入到两张表中,每个导出表都需要全部的数据条数,所以选择了复制。
但是在“复制的数量”>1时,每个复制的表输出任务,都因为跳的类型是复制而得到了完整的数据,导致多个任务执行了同一个数据的多次插入。实际结果是等效于
三、解决办法
使用 空操作 控件,拆分数据流
四、修改跳类型
每个转换中,一个输入控件对应多个输出控件时,都会要求选择跳的类型,如果勾选过“请不要再显示这个信息”选择框,
在工具栏中点击工具->选项进行配置
或删除配置目录下.spoonrc
文件后重启即可重置所有默认配置,配置文件路径
C:\Users\用户名\.kettle\kettle.properties