Kettle中通过触发器方式实现数据 增量更新
在使用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的Spoon中创建下面的流程:
Main
主流程中需要注意的是,在整个流程中,前段的prepare 和 后续 finish 只需要执行一次,
中间的syn是需要重复循环的,至少LZ是这样设计的,这样可以使得在循环的这段时期中,
若是A表中的相关字段发生变化的话,会实时地将变化同步到 B C两个表中。
Main.prepare
在创建触发器的时候需要注意一下,LZ在实验的时候,
发现如果触发器若想触发 多条操作的时候,
是要写
" DELIMITER + 分隔符号 "
begin
commands
end
分隔符号
但是,kettle目前的版本是不支持 delimiter的, 也就是写上之后会报错,
不写上,若是执行多条命令语句 后面是必须要加 分号 ";" 来结尾的,
不加分号,也会报错,
若加上之后,触发器会默认为 到分号 触发内容就会结束, 也是出错的,
LZ的这个步骤之所以没有出错是因为,LZ创建的 触发器只有一条触发语句,所以没有用到 delimiter。
如果您想写多条 触发语句的话,在delimiter这里要注意一下吧~
Main.syn
Main.syn.delete_B_C_records
Main.syn.A_insert_BandC
这里需要注意的是,在A_insert_into_C这个步骤的时候,对应的目标表中要选择为c表。
而且,使用触发器+快照表 进行数据增量更新 主要是通过 :先根据源表中变化(update delete)的记录 对应删除目标表中的字段,
然后再,将A表中变化的字段插入到目标表中; 所以整个过程不存在 使用源表 对 目标表进行更新 操作。所以"不执行任何更新" 要勾选 .
Main.finish
收尾工作,主要回收资源,调用Sql语句,执行删除 快照表、触发器工作。
接下来我们向A表中,
1.insert 一条记录,
2.delete一条 同时存在于 A B C表中的记录,
3.update 一条A表中的记录。
4.然后对 A表中的 同一条 记录 先 update 再 delete 它 看结果如何
5.(元数据) A表中还有上一次实验被存入的,但是B C两张表中所没有的 记录:
原A:
原B:
原C:
after prepare:
modify A :
执行上述的 1 2 3 4 操作后:
A:
snapshot table temp :
对A表的 id=8 进行一次update 一次 delete,
这个temp表需要对A_id进行去除重复记录操作,这也是为什么要在syn.delete_B_C_records中
去除重复记录的原因。
为了将整个流程分解,我们来调用Main.syn.delete_B_C_record 这个transformation:
之后显示的
B:
C:
接下来,使用A表对B,C两表进行 插入/更新步骤 即 Main.syn.A_insert_BandC
B: C:
这样的话,不仅实现了更新,删除,同步操作,而且同样把A表中的原来的字段同步到B C两张表中去了。
如果,不希望将A表中原有数据同步到B,C表中的话,可以通过字段选择来实现。
当然在具体业务中的情况要比实验内容复杂得多,这里仅提供简单的思路,
如果有不恰当之处,敬请指正。
Kettle中通过触发器方式实现数据 增量更新的更多相关文章
- 在论坛中出现的比较难的sql问题:9(触发器专题 插入数据自动更新表数据)
原文:在论坛中出现的比较难的sql问题:9(触发器专题 插入数据自动更新表数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所 ...
- **app后端设计(10)--数据增量更新(省流量)
在新浪微博的app中,从别的页面进入主页,在没有网络的情况下,首页中的已经收到的微博还是能显示的,这显然是把相关的数据存储在app本地. 使用数据的app本地存储,能减少网络的流量,同时极大提高了用户 ...
- app后端设计(10)--数据增量更新
在新浪微博的app中,从别的页面进入主页,在没有网络的情况下,首页中的已经收到的微博还是能显示的,这显然是把相关的数据存储在app本地. 使用数据的app本地存储,能减少网络的流量,同时极大提高了用户 ...
- 一个简单的数据增量更新策略(Android / MongoDB / Django)
我在做个人APP - CayKANJI - 的时候遇到一个问题: 如何增量式地把日语汉字数据地从server更新到APP端,即每次用户运行更新操作时,仅仅获取版本号高于本地缓存的内容. 数据格式 为了 ...
- Tensorflow中使用tfrecord方式读取数据-深度学习-周振洋
本博客默认读者对神经网络与Tensorflow有一定了解,对其中的一些术语不再做具体解释.并且本博客主要以图片数据为例进行介绍,如有错误,敬请斧正. 使用Tensorflow训练神经网络时,我们可以用 ...
- 在ASP.NET 中有哪些数据验证控件(请解释ASP.NET中以什么方式进行数据验证)?
(1)RequiredFieldValidator:检查用户是否输入: (2)CompareValidator:检查两个表单输入项的输入信息是否存在某种指定关系,比如大.等于等: (3)RangeVa ...
- mysql触发器:插入数据前更新创建时间为服务器的时间
DROP TRIGGER IF EXISTS `upd_patientquestionnaire`; create trigger upd_patientquestionnaire BEFORE in ...
- 【转】ETL数据增量抽取——通过触发器方式实现
在使用Kettle进行数据同步的时候, 共有 1.使用时间戳进行数据增量更新 2.使用数据库日志进行数据增量更新 3.使用触发器+快照表 进行数据增量更新 今天要介绍的是第3中方法. 实验的思路是这样 ...
- 【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中
最近有一个将 mysql 数据导入到 MongoDB 中的需求,打算使用 Kettle 工具实现.本文章记录了数据导入从0到1的过程,最终实现了每秒钟快速导入约 1200 条数据.一起来看吧~ 一.K ...
随机推荐
- GTK+中的树状列表构件(GtkTreeView)
GTK+中的树状列表构件(GtkTreeView) GTK+中的树状列表构件(GtkTreeView) 在本章的GTK+程序设计教程中,我们将向大家重点介绍非常常用也有点复杂的构件--GtkTreeV ...
- JSP---演示ErroPage、isErroPage和jsp:forword标签
属性说明: language – 示例:language="java" import -如: (注意多个引用之间使用逗号分开.) <%@ page import=" ...
- 2015年10月16日HTML标签表单笔记
textarea只是纯文本编辑框,要想输入各种样式的文本.图片.表格等需要使用“富文本编辑框”.html4暂无富文本编辑框,可使用第三方工具实现此效果. <textarea></te ...
- 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)
页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...
- javascript的类和构造函数
在javascript中,类的实现是基于其原型继承机制的.如果两个实例都从同一个原型对象上继承了属性,我们就说它们是同一个类的实例.那么,如果两个对象继承自同一个原型,那基本上可以认为它们是由同一个构 ...
- Web Service学习文旦下载
Web Service的学习暂且告一段落,因为毕竟只是对它作简要了解,至于其原理什么并不打算涉及. 在这里我提供下我之前文档的整理版本: http://kuai.xunlei.com/d/YlzvAG ...
- [四]JFreeChart实践三之饼图
饼图pie 原理总结 1.准备好要显示的数据放入dataset 2.调用ChartFactory将dataset作为参数传递进去,生成chart 3.掉Servlet工具类将chart作为参数传入生成 ...
- lucene创建索引简单示例
利用空闲时间写了一个使用lucene创建索引简单示例, 1.使用maven创建的项目 2.需要用到的jar如下: 废话不多说,直接贴代码如下: 1.创建索引的类(HelloLucene): packa ...
- Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...
- 【剑指Offer学习】【面试题19 :二叉树的镜像】
题目:请完毕一个函数,输入一个二叉树,该函数输出它的镜像. 二叉树结点的定义: /** * 二叉树的树结点 */ public static class BinaryTreeNode { int va ...