一. Kettle能做什么?
数据迁移, 数据增量同步, 数据收集.
二. kettle运行方式
- 使用kettle的GUI客户端运行.
- 命令行运行
- 通过kettle的server端运行.
三. kettle实例
环境准备
- 安装 JDK
- 安装 MySQL
- 下载,解压kettle
数据准备
mysql数据库创建脚本
# 创建数据库
create database kettle_demo;
use kettle_demo;
# 区域表(存放省市名称以及关系)
CREATE TABLE `t_district` (
`id` int(11) unsigned NOT NULL COMMENT '主键',
`name` varchar(20) DEFAULT NULL COMMENT '区域名称',
`p_id` int(11) DEFAULT NULL COMMENT '上级区域id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 插入省市数据
insert into t_district(id,name,p_id) values(1,'湖北省',0);
insert into t_district(id,name,p_id) values(2,'武汉市',1);
insert into t_district(id,name,p_id) values(3,'黄石市',1);
insert into t_district(id,name,p_id) values(4,'荆州市',1);
insert into t_district(id,name,p_id) values(5,'广东省',0);
insert into t_district(id,name,p_id) values(6,'广州市',5);
insert into t_district(id,name,p_id) values(7,'中山市',5);
# 源数据表
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(50) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '姓名',
`sex` int(11) DEFAULT NULL COMMENT '性别: 0.男 1.女',
`del` int(11) NOT NULL COMMENT '是否删除: 1.已删除 0.未删除',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '时间戳,会自动更新',
`cityId` int(11) DEFAULT NULL COMMENT '城市id',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
# 向t_user中插入原始数据
insert into t_user(name,sex,del,cityId) values('张三',0,0,2);
insert into t_user(name,sex,del,cityId) values('李四',1,0,3);
insert into t_user(name,sex,del,cityId) values('王五',1,0,4);
insert into t_user(name,sex,del,cityId) values('赵六',1,0,6);
insert into t_user(name,sex,del,cityId) values('孙七',1,0,7);
insert into t_user(name,sex,del,cityId) values('钱八',1,0,7);
# 目标数据表
CREATE TABLE `t_copy_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(50) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '姓名',
`sex` int(11) DEFAULT NULL COMMENT '性别: 0.男 1.女',
`del` int(11) NOT NULL COMMENT '是否删除: 1.已删除 0.未删除',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`cityId` int(11) DEFAULT NULL COMMENT '城市id',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `t_new_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(50) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '姓名',
`sex` int(11) DEFAULT NULL COMMENT '性别: 0.男 1.女',
`del` int(11) NOT NULL COMMENT '是否删除: 1.已删除 0.未删除',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`city_name` varchar(20) DEFAULT NULL COMMENT '城市名称',
`province_name` varchar(20) DEFAULT NULL COMMENT '省份名称',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
kettle界面简介
主界面
资源库列表
资源库创建
kettle概念
资源库
作用
存储kettle脚本的代码
分类
文件资源库, 数据库资源库
建议使用文件资源库方式存放kettle脚本
**为什么? ** 因为稍微复杂一点的kettle脚本,都会涉及到脚本互相调用, 使用了kettle文件资源库方式管理kettle脚本,那么使用的就是相对路径.这样无论你的脚本放在哪里, 都可以正常运行. (这个表述不正确, 但你应该能够这句话的意思吧)
作业
可以将一个kettle作业看作一个java项目
转换
可以将一个kettle转换, 看成是一个项目下的功能模块
1. 使用kettle进行表数据复制
设置字符编码,解决可能的中文乱码问题characterEncoding=utf8
2. 使用kettle进行表数据的增量同步
情况一: 源数据表存在自增长id,且原表数据不会修改和删除
将目标表也设置一个id字段, 每次先取目标表的最大id, 然后通过这个id, 获取源数据表中所有大于该id的所有行数据
情况二: 源数据表存在一个实时更新的时间字段,且对该表中的数据进行逻辑删除, 任何对记录的修改,该字段的值都会更新为操作的执行时间
将目标表也设置一个时间字段, 每次获取目标的最大时间, 然后将源数据表中所有大于该时间的记录都复制到目标表中.
本实例, 实现 "情况二" 的数据复制.
3. 关联数据获取(数据库查询方式实现)
场景模拟: 用户表存了城市编码, 区域表中存了城市编码和省份编码以及区域名称和关系.
4. 关联数据获取(多源数据合并方式实现)
5. 关联数据获取(Rest Client方式实现)
6. 大数据量采用分页方式同步
四. kettle环境切换
在开发环境完成需求 --> 再将kettle的job切换到测试环境测试 --> 测试通过后,将job发布到生产环境.