ETL工具 - Kettle 转换算子介绍
一、Kettle 转换算子
上篇文章对 Kettle 中的输入输出算子进行了介绍,本篇文章继续对转换算子进行讲解。
下面是上篇文章的地址:
ETL工具 - Kettle 输入输出算子介绍
转换是ETL
里面的T
(Transform
),主要做数据转换,数据清洗的工作。
二、转换算子介绍
数据输入以上篇文章中的表输入,表结构如下:
CREATE TABLE `user` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`age` int(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
INSERT INTO `user` VALUES (1, '小明', 90);
INSERT INTO `user` VALUES (2, '小红', 91);
INSERT INTO `user` VALUES (3, '小兰', 92);
INSERT INTO `user` VALUES (4, '小爱', 93);
INSERT INTO `user` VALUES (5, '张三', 94);
INSERT INTO `user` VALUES (6, '李四', 95);
INSERT INTO `user` VALUES (7, '王五', 96);
INSERT INTO `user` VALUES (8, '赵六', 97);
表输入控件:
2.1 增加常量
增加常量就是在本身的数据流里面添加一列常量数据,值都是相同的内容。
运行后预览数据:
2.2 增加序列
增加序列同样给数据流添加一个字段,但可以自定义该序列字段的递增步长:
运行后预览数据:
2.3 值映射
值映射就是把字段的一个值映射成其他的值:
运行后预览数据:
2.4 Concat fields
将多个字段连接起来形成一个新的字段:
运行后预览数据:
2.5 字段选择
可以从数据流中进行选择字段、改变名称、修改数据类型等:
运行后预览数据:
2.6 计算器
一个函数集合,可以通过里面的多个计算函数对已有字段进行计算,例如计算 id*age
的值:
运行后预览数据:
2.7 剪切字符串
根据输入流字段,从摸个位置开始剪切出新的字段:
运行后预览数据:
2.8 字符串替换
根据输入流字段,替换某个字符形成新的字段:
运行后预览数据:
2.9 字符串操作
可以去除字符串两端的空格和大小写切换:
这里再对user
表增加两个测试数据:
INSERT INTO `test`.`user`(`id`, `name`, `age`) VALUES (9, 'xiao ai', 22);
INSERT INTO `test`.`user`(`id`, `name`, `age`) VALUES (10, ' wangwu ', 23);
运行后预览数据:
2.10 排序记录
根据指定字段进行升序或者降序排列:
运行后预览数据:
2.11 去除重复记录
去除数据流里面相同的数据行,使用之前要求必须先对数据进行排序:
对数据库中添加两个名字相同的数据:
运行后预览数据:
2.12 唯一行 (哈希值)
根据哈希值只允许保留一行,同样可以实现去重的效果:
运行后预览数据:
2.13 拆分字段
把字段按照分隔符拆分成两个或多个字段,需要注意,字段拆分后,原字段就会从数据流中消失:
再添加两条测试数据:
INSERT INTO `test`.`user`(`id`, `name`, `age`) VALUES (11, '小王,小七', 22);
INSERT INTO `test`.`user`(`id`, `name`, `age`) VALUES (12, '小八,小九', 23);
运行后预览数据:
2.14 列拆分为多行
某个字段根据指定分隔符进行拆分成多行,其他字段相同:
运行后预览数据:
2.15 列转行
多列转一行,如果数据一列有相同的值,可以按照指定的字段,将其中一列的字段内容变成不同的列字段,列转行之前数据流必须按照分组字段进行排序,否则数据会错乱:
创建新测试表:
CREATE TABLE `test` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`week` varchar(255) DEFAULT NULL,
`work` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
写入测试数据:
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (1, '张三', '1', '10');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (3, '张三', '2', '10');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (5, '张三', '3', '10');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (7, '张三', '4', '10');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (9, '张三', '5', '9');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (11, '张三', '6', '8');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (13, '张三', '7', '0');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (2, '李四', '1', '10');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (4, '李四', '2', '10');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (6, '李四', '3', '10');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (8, '李四', '4', '10');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (10, '李四', '5', '8');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (12, '李四', '6', '8');
INSERT INTO `test`.`test`(`id`, `name`, `week`, `work`) VALUES (14, '李四', '7', '5');
下面根据 name
分组后 week
的值转为列展示 work
字段:
运行后预览数据:
2.16 行转列
和上一个控件相反,将数据行变为数据列,下面将上一步处理的还原会最初的效果:
运行后预览数据:
2.17 行扁平化
把同一组的多行数据合并成为一行,使用之前需要对数据进行排序,每个分组的数据条数要保证一致,否则数据会有错乱:
创建新的测试表:
CREATE TABLE `user3` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`grade` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
写入测试数据:
INSERT INTO `test`.`user3`(`id`, `name`, `grade`) VALUES (11, '小明', 90);
INSERT INTO `test`.`user3`(`id`, `name`, `grade`) VALUES (12, '小明', 91);
INSERT INTO `test`.`user3`(`id`, `name`, `grade`) VALUES (13, '小明', 96);
INSERT INTO `test`.`user3`(`id`, `name`, `grade`) VALUES (14, '小兰', 90);
INSERT INTO `test`.`user3`(`id`, `name`, `grade`) VALUES (15, '小兰', 88);
INSERT INTO `test`.`user3`(`id`, `name`, `grade`) VALUES (16, '小兰', 60);
INSERT INTO `test`.`user3`(`id`, `name`, `grade`) VALUES (17, '李四', 70);
INSERT INTO `test`.`user3`(`id`, `name`, `grade`) VALUES (18, '李四', 71);
INSERT INTO `test`.`user3`(`id`, `name`, `grade`) VALUES (19, '李四', 72);
运行后预览数据: