Kettle_Day3_时间戳增量同步

该方法适用场景:

          表中有一列记录该条字段最新修改时间的时间戳列。

核心思想:

          用一张表记录上次抽取的时间(初始时间2000-01-01),然后每次从源表接着上次的时间抽取数据到目标表。

一.前期准备

分表创建两张表

# 创建源表
CREATE TABLE `im_message` (
  `id` int NOT NULL AUTO_INCREMENT,
  `sender` varchar(45) COLLATE utf8_bin NOT NULL COMMENT '消息发送者:SYSTEM',
  `send_time` datetime(6) NOT NULL,
  `receiver` varchar(45) COLLATE utf8_bin NOT NULL COMMENT '消息接受者',
  `content` varchar(255) COLLATE utf8_bin NOT NULL COMMENT '消息内容',
  `is_read` tinyint NOT NULL COMMENT '消息是否被读取:0-未读;非0-已读',
  `read_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='消息表'

;
# 创建目标表
CREATE TABLE `im_message_target` (
  `id` int NOT NULL AUTO_INCREMENT,
  `sender` varchar(45) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '消息发送者:SYSTEM',
  `send_time` datetime(6) NOT NULL,
  `receiver` varchar(45) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '消息接受者',
  `content` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '消息内容',
  `is_read` tinyint NOT NULL COMMENT '消息是否被读取:0-未读;非0-已读',
  `read_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='消息表'

;
# 创建存放时间戳的表
CREATE TABLE IF NOT EXISTS etl_temp(id int primary key,time_stamp datetime);
# 插入初始时间
INSERT INTO etl_temp (id,time_stamp) VALUES (1,'2000-01-01');

二.创建作业,拖入以下控件

Kettle_Day3_时间戳增量同步_第1张图片

三.创建<获取上次执行时间>的转换

Kettle_Day3_时间戳增量同步_第2张图片

表输入中填入:

Kettle_Day3_时间戳增量同步_第3张图片

select date_format(time_stamp , '%Y-%m-%d %H:%i:%s') time_stamp 
  from etl_temp where id='1'

设置变量:

Kettle_Day3_时间戳增量同步_第4张图片

四.创建<增量同步>的转换

Kettle_Day3_时间戳增量同步_第5张图片

 

原表输入:

Kettle_Day3_时间戳增量同步_第6张图片

SELECT
  id
, sender
, send_time
, receiver
, content
, is_read
, read_time
FROM im_message
where send_time>= date_sub(str_to_date('${TIME_STAMP}','%Y-%m-%d %H:%i:%s'), interval 1 day);

目标表输入:

Kettle_Day3_时间戳增量同步_第7张图片

SELECT
  id
, sender
, send_time
, receiver
, content
, is_read
, read_time
FROM im_message_target
where send_time>= date_sub(str_to_date('${TIME_STAMP}','%Y-%m-%d %H:%i:%s'), interval 1 day);

 

对比记录:

Kettle_Day3_时间戳增量同步_第8张图片

对两个表输入查出的数据进行比对,并把比对的结果写进输入流,传递给后面的组件。
比对的结果(flagfield 标识字段)有三种:

  • new
  • changed
  • deleted

标注字段表示比对结果的字段名,后面有用。关键字段表示比对的字段,在这个作业中我们比较两个的主键ID

switch/case :

Kettle_Day3_时间戳增量同步_第9张图片

 

表输出:

Kettle有一个插入/更新组件,但是据网友介绍这个组件性能低下,每秒最多只能同步几百条数据,所有我对插入和更新分别作了不同的处理。插入使用表输出组件;更新使用更新组件。
为了进一步提升同步效率,我在表输出组件使用了多线程(右键>改变开始复制的数量),使同步速度达到每秒12000条。Switch组件和表输出组件中间的虚拟组件(空操作)也是为了使用多线程添加的。
Kettle_Day3_时间戳增量同步_第10张图片

Kettle_Day3_时间戳增量同步_第11张图片

更新:

Kettle_Day3_时间戳增量同步_第12张图片

删除:

Kettle_Day3_时间戳增量同步_第13张图片

六.创建<更新时间戳>标识

Kettle_Day3_时间戳增量同步_第14张图片

update etl_temp 
set time_stamp= (SELECT date_format(SEND_TIME , '%Y-%m-%d %H:%i:%s') 
                   FROM im_message 
                 ORDER BY SEND_TIME DESC LIMIT 1
                ) 
where id='1';

七.运行测试:

Kettle_Day3_时间戳增量同步_第15张图片

你可能感兴趣的:(Kettle)