【转】ETL数据增量抽取——通过触发器方式实现
在使用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表中的话,可以通过字段选择来实现。
id | name | age | id | name | age | id | name | age | ||
1 | inuyasha | 29 | 1 | inuyasha | 29 | 1 | inuyasha | 29 | ||
3 | kagome | 22 | 3 | kagome | 22 | 3 | kagome | 22 | ||
4 | tego | 28 | 4 | tego | 28 | 4 | tego | 28 | ||
5 | kokia | 19 | 5 | kokia | 19 | 5 | kokia | 19 | ||
7 | Narutou | 18 | 7 | Narutou | 18 | 7 | Narutou | 18 | ||
8 | Sakura | 16 | 8 | Sakura | 16 | 8 | Sakura | 16 | ||
12 | test_name | 25 | 12 | test_name | 25 | 12 | test_name | 25 | ||
id | name | age | id | name | age | id | name | age | ||
3 | kagome | 22 | 1 | inuyasha | 29 | 1 | inuyasha | 29 | ||
4 | tego | 28 | 3 | kagome | 22 | 3 | kagome | 22 | ||
5 | nasume | 16 | 4 | tego | 28 | 4 | tego | 28 | ||
7 | Narutou | 18 | 5 | nasume | 16 | 5 | kokia | 19 | ||
8 | Sakura | 16 | 7 | Narutou | 18 | 7 | Narutou | 18 | ||
12 | test_name | 25 | 8 | Sakura | 16 | 8 | Sakura | 16 | ||
22 | for_test | 22 | 12 | test_name | 25 | 12 | test_name | 25 | ||
100 | xiehui | 25 | ||||||||
999 | ahou | 25 | ||||||||
id | name | age | id | name | age | id | name | age | ||
3 | kagome | 22 | 1 | inuyasha | 29 | 1 | inuyasha | 29 | ||
4 | tego | 26 | 3 | kagome | 22 | 3 | kagome | 22 | ||
5 | nasume | 16 | 5 | nasume | 16 | 5 | kokia | 19 | ||
7 | Narutou | 18 | 7 | Narutou | 18 | 7 | Narutou | 18 | ||
22 | for_test | 22 | ||||||||
100 | xiehui | 25 | ||||||||
999 | ahou | 25 | ||||||||
1000 | levins | 23 | ||||||||
temp_id | A_id | |||||||||
1 | 4 | |||||||||
2 | 12 | |||||||||
3 | 8 | |||||||||
4 | 8 |
当然在具体业务中的情况要比实验内容复杂得多,这里仅提供简单的思路,
如果有不恰当之处,敬请指正。
【转】ETL数据增量抽取——通过触发器方式实现的更多相关文章
- ETL之增量抽取方式
1.触发器方式 触发器方式是普遍采取的一种增量抽取机制.该方式是根据抽取要求,在要被抽取的源表上建立插入.修改.删除3个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个增量日志表 ...
- ETL中的数据增量抽取机制
ETL中的数据增量抽取机制 ( 增量抽取是数据仓库ETL(extraction,transformation,loading,数据的抽取.转换和装载)实施过程中需要重点考虑的问 题.在ETL过 ...
- 【转】ETL增量抽取——通过时间戳方式实现
这个实验主要思想是在创建数据库表的时候, 通过增加一个额外的字段,也就是时间戳字段, 例如在同步表 tt1 和表 tt2 的时候, 通过检查那个表是最新更新的,那个表就作为新表,而另外的表最为旧表被新 ...
- 数据仓库系列之ETL中常见的增量抽取方式
为了实现数据仓库中的更加高效的数据处理,今天和小黎子一起来探讨ETL系统中的增量抽取方式.增量抽取是数据仓库ETL(数据的抽取(extraction).转换(transformation)和装载(lo ...
- 《BI项目笔记》增量ETL数据抽取的策略及方法
增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据.在ETL使用过程中.增量抽取较全量抽取应用更广.如何捕获变化的数据是增量抽取的关键.对捕获方法一般有两点要求:准确性,能够将 ...
- Kettle中通过触发器方式实现数据 增量更新
在使用Kettle进行数据同步的时候, 共有 1.使用时间戳进行数据增量更新 2.使用数据库日志进行数据增量更新 3.使用触发器+快照表 进行数据增量更新 今天要介绍的是第3中方法. 实验的思路是这样 ...
- 使用Kettle增量抽取MongoDB数据实践
需求: 增量抽取MongoDB数据并加载到MSSQL 由于不能使用关系型数据库的自定义SQL, 所以主要遇到的问题有: 增量时间的查询和参数控制 ETL的批次信息和调用参数的写入 第一个问题的解决如下 ...
- kettle 6.1 按时间循环增量抽取数据
场景:假设有一张表数据量很大,需要按一个时间来循环增量抽取 方法:主要是通过JOB自身调用,实现循环调用,类似于 函数自调用 的循环. 1.JOB全图: 2.获取增量时间,并设置增量时间环境变量 3. ...
- sql中使用timestamp增量抽取数据
网址:http://www.cnblogs.com/shuaifei/p/4469526.html 最近的项目中需要对上百万级的数据进行增量抽取操作,因此了解了一下TIMESTAMP的应用,特此记录 ...
随机推荐
- Java List双击事件
1. 定义一个MouseListener: 2. 在mouseListener中增加mouseClicked事件: 3. 由MouseEvent的getSource()获得List对象: 4. 由Li ...
- 关于【error C3646: 未知重写说明符】的若干种可能性
如果在程序中出现了error C3646,那么这个错误可能是由多种问题所导致的,这篇文章将对多种错误及对应解决方法进行分析. 在MSDN的官方网站中,Complier Error C3646的定义为u ...
- TestNG 三 测试方法
一.设置参数 测试方法是可以带有参数的.每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递正确的参数. 设置方式有两种方法:使用testng.xml或 ...
- Java识别操作系统
/** * Created by xfyou on 2016/11/3. */ public class SysDep { final static String UNIX_NULL_DEV = &q ...
- java集合-hashCode
hashCode 的作用 在 Java 集合中有两类,一类是 List,一类是 Set 他们之间的区别就在于 List 集合中的元素师有序的,且可以重复,而 Set 集合中元素是无序不可重复的.对于 ...
- Ionic - 先进的 HTML5 移动开发框架和 SDK
Ionic 是开源的 HTML5 移动开发框架,基于 HTML.JavaScript.CSS 构建漂亮的,跨平台的混合模式 App,能够和 AngularJS 很好的集成.目前最佳支持的平台是 iOS ...
- Cool!15个创意的 CSS3 文本效果【下篇】
这里文章收集了15个创意的 CSS3 文本效果,所有的都是精心挑选,这些可能会增加创意的火花到你的下一个项目.其中有些是用于特定用途,而另一些则适用于多种用途.如果你想要一个精彩而又充满色彩的文字效果 ...
- LigerUi框架+jquery+ajax无刷新留言板系统的实现
前些天发布了LigerUi框架的增.删.改代码,一堆代码真的也没一张图片.有的网友推荐上图,所有今天把涉及到这个框架的开源的留言板共享给大家.在修改的过程中可能有些不足的地方希望大家拍砖. 因为留言板 ...
- Web前端面试题目汇总
以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中有一些未解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,欢迎指正,水平有限,望各位不吝指教.: ...
- web前端命名规范
在做web项目的时候,命名的规范是很重要.初学者一般急于求成对命名规范没有概念,觉得花时间这些还不如多看几遍框架.其实在我看来,一个良好的命名习惯是很重要的.下面就来介绍一下我总结的命名规范: (1) ...