表中有一列记录该条字段最新修改时间的时间戳列。
用一张表记录上次抽取的时间(初始时间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');
select date_format(time_stamp , '%Y-%m-%d %H:%i:%s') time_stamp
from etl_temp where id='1'
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);
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);
对两个表输入查出的数据进行比对,并把比对的结果写进输入流,传递给后面的组件。
比对的结果(flagfield 标识字段)有三种:
标注字段表示比对结果的字段名,后面有用。关键字段表示比对的字段,在这个作业中我们比较两个的主键ID
。
Kettle有一个插入/更新组件,但是据网友介绍这个组件性能低下,每秒最多只能同步几百条数据,所有我对插入和更新分别作了不同的处理。插入使用表输出组件;更新使用更新组件。
为了进一步提升同步效率,我在表输出组件使用了多线程(右键>改变开始复制的数量),使同步速度达到每秒12000条。Switch组件和表输出组件中间的虚拟组件(空操作)也是为了使用多线程添加的。
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';