kettle-数据同步比较数据(删除更新)

需求是这样的:
从A数据库取数据到B数据库,A库中表只包含有效数据,因此同步到B库中也只能包含有效数据,其他的数据要么更新,要么删除,或者新增。

总体解决方案:
在这里插入图片描述
因为脚本是第三方执行的,我们没有权限执行脚本,同样也没有第三方也就是上面说的A库的权限,因此我们一开始一直纠结怎么取数据,把解决问题的点一直关注B库,后来才反应过来,既然是第三方执行脚本,他们有A库权限,那么执行脚本应该把A库算在可执行解决问题的范围内,不应该只是将其作为一个简单的表输入使用。

具体解决方案:

  • 首先将库A、B的表作为表输入
  • 然后“字段选择”是选择输出的字段(不输出不写),并且可以重新命名(这个功能很好,可以将不同表数据命名统一),进行排序
  • 然后合并记录(合并记录之前必须排序,合并记录其实就是根据主键判断两表对应数据是否一致,合并记录后会形成标志位,用于判断数据是更新、删除还是新增,不变)
  • 然后根据标志位使用switch/case对数据进行状态判断
  • 根据标志位状态进行删除、插入更新。

表输入:
在这里插入图片描述
字段选择:
选择需要

### Kettle 中实现插入更新操作 在Kettle中,可以利用特定的转换步骤来处理数据的插入和更新操作。对于MySQL数据库而言,通常会采用两种主要方法之一:一是通过SQL语句直接执行插入或更新命令;二是借助于Kettle提供的专门组件——“表输入/输出”以及“更新”。 #### 方法一:使用 SQL 脚本进行插入更新 当需要对目标表执行复杂的逻辑判断时,编写自定义SQL脚本来完成插入更新是最直观的方式。例如,在给定的例子中提到的 MySQL 内置语法可以通过如下方式应用于Kettle: ```sql INSERT INTO user_b (id_b, username, age, sex, stature, occupation) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE username = VALUES(username), age = VALUES(age), sex = VALUES(sex), stature = VALUES(stature), occupation = VALUES(occupation); ``` 此查询允许一次性解决新记录的插入与现有记录字段值的替换问题[^2]。 为了使上述SQL能够在Kettle环境中运行,需按照以下流程设置相应的转换步骤: 1. **获取源数据**:从CSV文件或其他任何支持的数据源读取待处理的信息。 2. **准备参数化查询**:构建带有占位符(即问号)的SQL模板字符串,并将其传递至后续步骤。 3. **配置JDBC连接**:指定要访问的目标数据库及其认证凭证。 4. **执行SQL语句**:调用“执行SQL语句”步骤并关联之前准备好的SQL表达式及参数列表。 #### 方法二:运用 Kettle 组件简化操作 除了手动编码外,还可以充分利用Pentaho Data Integration(Kettle)自带的功能模块来进行更简便的操作。具体来说,“表输出(Table Output)”可用于新增行项,而“更新(Update)”则负责修改已存在的实体属性。 ##### 表输出 Table Output 该插件能够自动检测到主键冲突情况,并提供选项让用户决定是在遇到重复键的情况下跳过写入还是覆盖旧有内容。不过需要注意的是,默认情况下它只会尝试添加新的条目而不做更改已有记录的动作。 ##### 更新 Update 相比之下,“更新”功能更加专注于定位匹配条件下的单个对象实例,并对其部分列实施变更。因此如果仅希望针对某些特定字段应用最新值,则推荐选用这种方式。 下面是一个简单的例子展示如何组合这两个工具以达到既定目的: - 配置好必要的输入流之后,先经过一个过滤器筛选出那些确实存在差异因而有必要同步的部分; - 接着把这些改动推送至“表输出”,确保所有缺失的新成员被接纳进来; - 对于剩余下来的重合项目,则交给“更新”去调整它们的状态直至一致为止。 这种方法不仅提高了效率而且减少了潜在的风险,因为每一步骤都得到了清晰界定并且易于维护管理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值