Kettle实现对源数据已删除但历史同步到的数据进行打标

编程入门 行业动态 更新时间:2024-10-25 08:21:22

Kettle实现对源<a href=https://www.elefans.com/category/jswz/34/1771445.html style=数据已删除但历史同步到的数据进行打标"/>

Kettle实现对源数据已删除但历史同步到的数据进行打标

目标背景:

通过Kettle实现ETL将A库A数据同步到B库B表,但是业务数据有物理删除,再B库B表中想要和A库A表数据一致

解决方法一:

做全量同步,再下一次同步之前,先全部truncate/delete 情况表所有数据,再做当前原表信息数据全量新增Insert

解决方式二:

当我同步到B库B表的数据,根据业务情况,不能做数据删除时,如何解决增量同步时由于上游物理删除产生再库里的“历史脏数据”,解法---对数据打标记falg ,对数据打标如何实现?具体解法如下

打标,涉及到数据比对,用kettle的增量同步(insert/update组件)同步数据的方式怎么进行数据比对? 目前我还没有实践出解法,我的解法是增加一个打标的过程处理

因为源和目标是AB两个库,没法使用SQL脚本做两个表的直接查询或者是关联查询比较出已经不存在的数据,源也只会给我他当时存在的数据,给不出删除信息。

考虑解法:

1、既然不能再SQL脚本里关联两个不同源的表,是否能通过把原表数据都查出来,用SQL脚本通过select not in 来获取 脏数据?

结果:由于取数据的表数据是一个数据流过程,再连接传输时是一条数据一条数据传递,如果用SQL脚本 去查源表,查不到的数据,无法再继续往下流转作为我打标的参数,无法实现目的。

2、既然不能再SQL脚本里关联两个不同源的表,是否能通过组件再Kettle里实现数据JOIN,然后将查不到的NULL数据通过SQL脚本删除?

结果:通过取两个表的唯一主键数据,通过排序合并(排序合并是必须的)用记录集连接,将数据left join,然后再通过过滤记录,筛出关联值为null的主键,作为参数穿给,执行SQL脚本,进行数据删除。

如下图:

步骤分讲:

步骤1:表输入->取两个库的表数据(只取主键,并排序)

表一contract,具有历史脏数据需要打标的表

表二contract,源数据表里面不包含已删除数据。

 

 

 

 步骤二:排序合并

表一配置

表二配置

步骤三:核心步骤-记录集连接

此方法可以使表一表二进行关联,此处使用left outer zuo左关联,主表是表一(带有脏数据)

 

步骤四:核心步骤-过滤记录

选择将true结果传递给下已给sql脚本,条件使用表二中额外附加的主键字段,如果该字段是NULL则表名是需要标记的脏数据。

 步骤五:执行SQL脚本

选择流中的主键字段作为参数传递给sql,执行每一行,变量替换。 

以上配置完毕,

看下执行日志:(行级别)

比较出不一致的数据进行更新

执行结果:实现对63行已删除数据打标

 效率:

近8万数据,标记63行问题数据,1min左右

终极目标,怎么实现再同步数据时,既同步新增和更新,又对脏数据进行标记

解法:将两个独立的线程放在一个里面

如下图:

 一起执行

评估:

放在一起会不会产生操作同一行数据,导致读写数据锁表,答案是不会的,因为新增和更新都是操作原表有的数据,而大标记是操作原表取不到的数据,两个线程不会对同一行进行操作。

结果上实现了对增量同步对物理删除数据打标,性能良好。

感谢观看

 

 

 

 

 

 

更多推荐

Kettle实现对源数据已删除但历史同步到的数据进行打标

本文发布于:2024-03-04 02:18:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1708002.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据   历史   Kettle

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!