在Kettle里使用快照实现变化数据捕获(CDC)
时间:2022-06-22
本文章向大家介绍在Kettle里使用快照实现变化数据捕获(CDC),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1. 建立测试表,插入数据。
use test;
create table t_color (
id int unsigned not null auto_increment primary key,
color varchar(10)
) engine=MyISAM;
insert into t_color (color) values('Black'),('Green'),('Red'),('Blue');
select * from t_color;
2. 建立快照表。
use test;
create table t_color_stg engine=MyISAM as select * from t_color ;
select * from t_color_stg;
3. 建立目标表。
use test;
create table dim_color engine=MyISAM as select * from t_color ;
select * from dim_color;
4. 建立基于快照的CDC转换
说明:
- 创建两个“表输入”步骤,一个是t_color的表输入,另一个是t_color_stg的表输入。在表输入里选中所有字段,并按照关键字段排序。然后添加一个“合并记录”步骤,把两个表输入步骤都连接到“合并记录”步骤,选择哪个步骤是旧数据来源,哪个步骤是新数据来源,选择标志字段包含unchanged、changed、new、deleted数据,另外设置关键字段和需要比较的字段。
- 为了过滤没有发生变化的数据,在后面再增加一个“过滤记录”步骤,过滤条件是“flagfield=identical”,把所有没有变换的数据都发送到“空操作”步骤,把新增、删除、修改的数据发送到“数据同步”步骤,该步骤可以根据标志字段自动进行增加、删除、修改等操作。
5. 测试 -- 执行转换 -- 查看dim_color表 mysql> select * from dim_color; +----+--------+ | id | color | +----+--------+ | 1 | Black | | 2 | Green | | 3 | Red | | 4 | Blue | +----+--------+ 4 rows in set (0.00 sec) -- 修改数据
delete from t_color where id=3;
update t_color set color='Grey' where id=1;
insert into t_color (color) values('Yellow');
-- 执行转换 -- 查看dim_color表 mysql> select * from dim_color; +----+--------+ | id | color | +----+--------+ | 1 | Grey | | 2 | Green | | 5 | Yellow | | 4 | Blue | +----+--------+ 4 rows in set (0.00 sec) 6. 总结
- 快照表就是一次性抽取源系统中的全部数据,把这些数据加载到数据仓库的缓冲区中。下一次需要同步时,再从源系统中抽取全部数据,并把全部数据也放到数据仓库的缓冲区中,作为这个的第二个版本,然后再比较这两个版本的数据,找到变化。
- 基于快照的CDC可以检测到插入、更新和删除的数据,这是相对于基于时间戳的CDC方案的有点,但它的缺点是要大量的存储空间来保存这些快照。另外,在表比较大时,也会有比较严重的性能问题。因为会有这种性能问题,所以也可以使用SQL来做比较,数据库引擎的性能往往比ETL引擎的性能更好。
比较的SQL语句如下:
select 'U' as flag, t2.id as id, t2.color as color
from t_color_stg t1 inner join t_color t2 ON t1.id = t2.id
where t1.color != t2.color
union all
select 'D' as flag, t1.id as id, t1.color as color
from t_color_stg t1 left join t_color t2 ON t1.id = t2.id
where t2.id is null
union all
select 'I' as flag, t2.id as id, t2.color as color
from t_color as t2 left join t_color_stg as t1 ON t2.id = t1.id
where t1.id is null;
结果如下:
+------+----+--------+ | flag | id | color | +------+----+--------+ | U | 1 | Grey | | D | 3 | Red | | I | 5 | Yellow | +------+----+--------+ 3 rows in set (0.00 sec)
- 深入理解DIP、IoC、DI以及IoC容器
- C#委托使用详解(Delegates)
- LINC switch系列之安装指南
- 设计模式成长记(一) 抽象工厂模式(Abstract Factory)
- 基于Open vSwitch的VxLAN隧道实验网络
- 来来来,快来围观那个Kotlin
- 怎样提高网站访问速度缩短网页加载时间
- 使用Kotlin开发一个Spring Boot Webflux Streaming应用(附视频)
- 插入排序算法
- Javascript 的addEventListener()及attachEvent()区别分析
- 设计模式-用接口来实现filter!梭梭就是干!
- OpenDaylight实现轮询策略的负载均衡服务
- 微服务业务开发三个难题-拆分、事务、查询(上)
- 总结了一些指针易出错的常见问题(五)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Java】07 常见 API
- 【Java】04 数组
- hadoop分布式格式化时出现异常java.net.unknownhostexception
- 【Java】05 面向对象
- 【Java】08 集合
- PAT (Advanced Level) Practice 1001 A B Format (20 分)
- 【Java】09 List 集合与 Collections 工具类
- PAT (Advanced Level) Practice 1003 Emergency (25 分)
- 数据结构严书习题6.65已知前中序,求二叉链表
- 【Java】10 Deque 接口
- 12.深入k8s:kubelet创建pod流程源码分析
- (较为详细)树的遍历方式一览(附完整源码可在VScode与cb运行)
- 【Java】12 Map 集合
- 【Java】11 Set 集合
- 4.表格-HTML基础