Kettle中通过触发器方式实现数据 增量更新

摘要:
有1个。使用时间戳进行增量数据更新2。使用数据库日志进行增量数据更新3。使用触发器+快照表进行增量数据更新今天,我们将在第三部分介绍该方法。触发器会将表A中相应更改字段的主键值写入名为temp的临时表(用作快照表)。表A中新插入的记录器不会记录在临时快照表中,表C中的相应字段将被删除。
在使用Kettle进行数据同步的时候, 共有

1.使用时间戳进行数据增量更新

2.使用数据库日志进行数据增量更新

3.使用触发器+快照表 进行数据增量更新

 

今天要介绍的是第3中方法。

 实验的思路是这样的,在进行数据同步的时候,

源数据表为A表, A表要对 目标表(target table) B 表和C表进行数据的同步更新。

即A表中的对应字段发生变化之后,

 会通过触发器将对应变化的字段在A表中的主键值写入到一个临时表temp中(该表作为快照表使用)。

快照表中只有两个字段,一个是temp_id,是快照表的主键,另一个是 A_id,记录的是在A表中发生变化的字段对应的主键的值。

temp( temp_id int primary key auto_increment , A_id int );

 

接下来,通过对快照表temp进行扫描,把在B表和C表中出现的与temp表中与A_id相匹配的字段,

从B,C两个目标表中进行移除。

 

在接下来,让A表作为源 让B和C作为目标 对B,C做插入/更新操作;

这样就实现了A表对B,C两个表的更新,在后续的操作中可以使用SQL语句将 temp表, 以及触发器进行 drop操作,以免其浪费内存资源。

 

在创建 trigger的时候,只要针对A表的 删除、 更新操作进行创建trigger 即可。

下面来分析一下,对A表进行的不同操作的情况:

 

1.如果是向A表中插入一行数据: 没有对应的触发器,新插入A表的recorder 并没有被记录到temp 快照表中,

所以不会对B,C表中对应的字段进行移除操作。(不对 A 表的Insert 操作创建 trigger

可以避免 如果对 A表进行插入的 主键值 在 B, C表中 根本找不到,

这样的话无法 根据temp 中记录的 主键值 对B,C表中的字段进行移除 )

即便不建立触发器,后续操作中仍旧会因为有 插入/更新的这个 step,对B 表 和 C表进行插入操作的。

 

2.如果是向A表删除一行数据的话, 对应创建的触发器会将 A表中被删除的 主键 字段写入到 temp这个快照表中去,

接下来,会依照temp表中的字段对B 表和 C 表中的记录进行移除操作。

而在后续的插入更新操作中,A表中已经将该记录进行移除了,所以没有对应的记录对B,C两张表进行插入操作。

 

3. 如果对A表中的某一条记录 进行 Update 更新操作的话 ,对应Update进行创建的触发器会 把A表中被更新的记录

所对应的主键值 写入到快照表 temp中去,

接下来会根据temp表中的主键值,对表B 表 C 中的字段进行移除,

然后对B表 C表 依照 A表中的字段进行 插入更新操作。

 

插入更新操作是这样的,

如果是主键值相等的话, 目标表对应字段 与 源表对应字段 不相同,

就会对目标表字段进行依照 源表进行更新,

如果是某条记录的 主键值 在源表中出现,但是在目标表中没有出现的话,

则对目标表进行相应的插入操作。(依照源表)

 

========================================================================

 

接下来,简单介绍一下实验数据:

首先,在Mysql中创建3个表, A B C 表,

对应的字段都是一样的,对应的数据也都是一样的(为了简便......)。

Kettle中通过触发器方式实现数据 增量更新第1张

 

接下来,在Kettle的Spoon中创建下面的流程:

 

Main

 

 

 

主流程中需要注意的是,在整个流程中,前段的prepare 和 后续 finish 只需要执行一次,

中间的syn是需要重复循环的,至少LZ是这样设计的,这样可以使得在循环的这段时期中,

若是A表中的相关字段发生变化的话,会实时地将变化同步到 B C两个表中。

 

 

 

Kettle中通过触发器方式实现数据 增量更新第2张

 

 

Main.prepare

在创建触发器的时候需要注意一下,LZ在实验的时候,

发现如果触发器若想触发 多条操作的时候,

是要写

" DELIMITER + 分隔符号 "

begin

commands

end

分隔符号

但是,kettle目前的版本是不支持 delimiter的, 也就是写上之后会报错,

不写上,若是执行多条命令语句 后面是必须要加 分号 ";" 来结尾的,

不加分号,也会报错,

若加上之后,触发器会默认为 到分号 触发内容就会结束, 也是出错的,

 

LZ的这个步骤之所以没有出错是因为,LZ创建的 触发器只有一条触发语句,所以没有用到 delimiter。

如果您想写多条 触发语句的话,在delimiter这里要注意一下吧~

 

Kettle中通过触发器方式实现数据 增量更新第3张

 

 

 Main.syn

Kettle中通过触发器方式实现数据 增量更新第4张

 

 

 Main.syn.delete_B_C_records

Kettle中通过触发器方式实现数据 增量更新第5张

 

Main.syn.A_insert_BandC

Kettle中通过触发器方式实现数据 增量更新第6张

这里需要注意的是,在A_insert_into_C这个步骤的时候,对应的目标表中要选择为c表。

 

而且,使用触发器+快照表 进行数据增量更新 主要是通过 :先根据源表中变化(update delete)的记录 对应删除目标表中的字段,

然后再,将A表中变化的字段插入到目标表中; 所以整个过程不存在 使用源表 对 目标表进行更新 操作。所以"不执行任何更新" 要勾选 .

 

Main.finish

Kettle中通过触发器方式实现数据 增量更新第7张

收尾工作,主要回收资源,调用Sql语句,执行删除 快照表、触发器工作。

 

接下来我们向A表中,

1.insert 一条记录,

2.delete一条 同时存在于 A B C表中的记录,

3.update 一条A表中的记录。

4.然后对 A表中的 同一条 记录 先 update 再 delete 它 看结果如何

5.(元数据) A表中还有上一次实验被存入的,但是B C两张表中所没有的 记录:

原A:

Kettle中通过触发器方式实现数据 增量更新第8张

原B:

Kettle中通过触发器方式实现数据 增量更新第9张

原C:

Kettle中通过触发器方式实现数据 增量更新第10张

 

after prepare:

Kettle中通过触发器方式实现数据 增量更新第11张

 

Kettle中通过触发器方式实现数据 增量更新第12张

modify A :

Kettle中通过触发器方式实现数据 增量更新第13张

 

 

执行上述的 1 2 3 4 操作后:

A:

     Kettle中通过触发器方式实现数据 增量更新第8张                   Kettle中通过触发器方式实现数据 增量更新第15张

 

snapshot table temp :

Kettle中通过触发器方式实现数据 增量更新第16张

对A表的 id=8 进行一次update 一次 delete,

这个temp表需要对A_id进行去除重复记录操作,这也是为什么要在syn.delete_B_C_records中

去除重复记录的原因。

 

为了将整个流程分解,我们来调用Main.syn.delete_B_C_record 这个transformation:

之后显示的

 

B:

Kettle中通过触发器方式实现数据 增量更新第17张

C:

 Kettle中通过触发器方式实现数据 增量更新第18张

 

接下来,使用A表对B,C两表进行 插入/更新步骤 即 Main.syn.A_insert_BandC

 

B:Kettle中通过触发器方式实现数据 增量更新第19张    C:Kettle中通过触发器方式实现数据 增量更新第20张

 

这样的话,不仅实现了更新,删除,同步操作,而且同样把A表中的原来的字段同步到B C两张表中去了。

如果,不希望将A表中原有数据同步到B,C表中的话,可以通过字段选择来实现。

 

当然在具体业务中的情况要比实验内容复杂得多,这里仅提供简单的思路,

如果有不恰当之处,敬请指正。

 

原文地址:http://www.cnblogs.com/inuyasha1027/p/kettle_synchronized_trigger.html

免责声明:文章转载自《Kettle中通过触发器方式实现数据 增量更新》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇弄懂FaviconProgressBar 进度条 旋转下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据可视化之DAX篇(二十五)PowerBI常用的度量值:累计至今

https://zhuanlan.zhihu.com/p/64999937 经常碰到本年至今、本月至今的数据计算,其实还有一类计算是,从历史最早日期至今的累计计算,比如从开业到现在总共卖出了多少件商品,累计实现了多少销售额等。 本年累计称为YTD,历史至今的累计是不是可以称为HTD呢:) ;这样的时间段很可能是跨年的,所以时间智能函数并不适用,不过不用时间...

[开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计

[DotnetSpider 系列目录] 一、初衷与架构设计 二、基本使用 三、配置式爬虫 四、JSON数据解析与配置系统 五、如何做全站采集 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师的要求,大多是招JAVA、PYTHON,甚至于还有NODEJS,C++;再或者去开源中国查询C#的爬虫项目,仅有几个非常简单或是几年没有更新的项目。 而单...

NIO与AIO,同步/异步,阻塞/非阻塞

1.flip(),compact(),与clear()的使用 flip()内部实现,先将limit设为当前位置,再将缓冲区的postion设为0,所以是为将缓冲区的数据写出到其它通道或者get()作准备。 clear()内部实现,将limit设为缓冲区的容量,position设为0,limit的不同为clear()与flip()的区别,所以clear()是...

SQL Server dbcc checkdb 做了什么。

第一步:          读取系统元数据、读完这些数据后dbcc checkdb 就知道自己要检测的是一个怎样的数据库了、如果在这一步就出错了、dbcc 就直接出错          了、不会再运行下去。 第二步:          在dbcc checkdb 内部会对数据库运行dbcc checkalloc命令          dbcc checka...

MySQL性能优化

1. 简介 在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响。MySQL是目前使用最多的开源数 据库,但是MySQL数据库的默认设置性能非常的差,仅仅是一个玩具数据库。因此在产品中使用MySQL数据库必须进行必要的优化。 优化是一个复杂的任务,本文描述MySQL相关的数据库设计和查询优化,服务器...

Docker容器数据卷[4]

 是什么 先来看看Docker的理念: 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在docker中我们使用卷...