一、Kettle(PDI)简介
Kettle(Pentaho Data Integration, PDI)是一个强大的开源ETL工具,它通过提供图形化界面让用户能够轻松地设计和管理数据集成流程。在Kettle中,控件通常被称为步骤(Steps)或作业项(Job Entries),它们是构建转换(Transformation)和作业(Job)的基本单元。以下是关于Kettle(PDI)的一些常见控件的详细介绍:转换中的步骤(Steps)
- 表输入(Table Input)
- 从数据库表中读取数据。支持SQL查询来选择特定的数据。
- 文本文件输入/输出(Text File Input/Output)
- 用于导入或导出大型文本文件,如CSV、TXT等。可以配置源平面文件的类型、行分隔符和编码等属性。
- 过滤记录(Filter Rows)
- 根据条件筛选记录,例如只保留满足某些业务规则的数据行。
- 排序记录(Sort Rows)
- 对数据流中的记录进行排序,可以根据一个或多个字段进行升序或降序排列。
- 合并记录(Merge Rows)
- 合并两个不同的数据流,通常用于比较新旧数据集之间的差异。
- JavaScript修改(Modified JavaScript Value)
- 提供了自定义逻辑的功能,可以用来计算新的字段值、执行复杂的数据转换等。
- 字段选择(Select Values)
- 允许选择、重命名、移除或重新排序输入流中的字段,对于数据清洗非常有用。
- 分组(Group By)
- 对输入数据进行分组汇总,可以基于一个或多个字段对数据进行聚合计算,如求和、计数等。
- 数据库查询(Database Lookup)
- 在转换过程中查询数据库以获取额外的信息,这对于丰富原始数据集很有帮助。
- 表输出(Table Output)
- 将处理后的数据写入目标数据库表中,提供了丰富的选项来控制如何插入或更新记录。
作业中的作业项(Job Entries)
- 启动(Start)
- 作业的开始点,表示作业从此处开始执行。
- 转换(Transformation)
- 可以在一个作业中运行一个或多个转换,允许复杂的流程控制。
- 成功(Success)
- 表示作业结束,并且所有之前的步骤都成功完成。
- Shell 或 Execute a Process
- 允许在作业中执行外部命令或脚本,如shell脚本、批处理文件等。
- 邮件(Mail)
- 发送电子邮件通知,可以在作业完成后发送状态报告或警报。
- 等待(Wait For SQL)
- 等待直到某个SQL查询返回结果,常用于确保前一个操作已经完成。
特殊组件
- 变量(Variables)
- 变量可以在整个转换或作业范围内共享数据,使得配置更加灵活。可以通过设置变量的值来动态控制流程的行为。
- 参数(Parameters)
- 参数允许用户在运行时为转换或作业提供输入值,增加了使用的灵活性。
- 日志记录(Logging)
- Kettle提供了详细的日志记录功能,可以帮助追踪ETL过程中的错误和性能瓶颈。
插件
Kettle还支持插件扩展,这使得它可以适应各种特殊的数据源和目标。例如,有专门针对Hadoop、MongoDB、Redis等大数据技术的插件,极大地增强了其兼容性和应用范围。二、任务背景介绍
1、背景
为了确保系统的安全性和功能完整性,需要将最新的接口权限数据从Excel文件导入到数据库中。这些权限数据定义了不同角色对系统内各个菜单和功能的访问权限,是保障系统安全性的重要组成部分。2、数据来源
- 文件类型: Excel 文件
- 文件内容: 包含三列数据——权限标识(Permission ID)、菜单ID(Menu ID)、权限标识名称(Permission Name)。
- 文件示例:
权限标识 菜单ID 权限标识名称
perm_001 menu_001 查看用户信息
perm_002 menu_002 编辑用户资料
3、相关数据库表
/*
Navicat Premium Data Transfer
Source Server : 10.13.3.17
Source Server Type : MySQL
Source Server Version : 80032
Source Host : 10.13.3.17:3306
Source Schema : swp_base
Target Server Type : MySQL
Target Server Version : 80032
File Encoding : 65001
Date: 06/03/2025 10:24:12
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for us_menu_perm
-- ----------------------------
DROP TABLE IF EXISTS `us_menu_perm`;
CREATE TABLE `us_menu_perm` (
`id` bigint(0) NOT NULL COMMENT 'ID',
`menu_id` bigint(0) NULL DEFAULT NULL COMMENT '菜单ID',
`perm_id` bigint(0) NULL DEFAULT NULL COMMENT '权限ID',
`perms` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限标识',
`sort` int(0) NULL DEFAULT NULL COMMENT '排序',
`type` int(0) NULL DEFAULT 0 COMMENT '类型',
`state` int(0) NULL DEFAULT 0 COMMENT '状态',
`is_deleted` tinyint(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '是否删除',
`create_time` datetime(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '创建时间',
`create_user` bigint(0) UNSIGNED NULL DEFAULT NULL COMMENT '创建人',
`update_time` datetime(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
`update_user` bigint(0) UNSIGNED NULL DEFAULT NULL COMMENT '更新人',
`version` int(0) NULL DEFAULT 1 COMMENT '版本',
`tenant_id` bigint(0) NULL DEFAULT NULL COMMENT '租户',
`trace_id` varchar(60) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT 'traceId',
`create_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
`update_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for us_menus
-- ----------------------------
DROP TABLE IF EXISTS `us_menus`;
CREATE TABLE `us_menus` (
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '权限ID',
`name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '' COMMENT '权限名称',
`code` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT 'CODE',
`description` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '描述',
`level` int(0) NULL DEFAULT NULL COMMENT '等级',
`super_menu_id` bigint(0) NULL DEFAULT NULL COMMENT '上级权限ID',
`data_model_id` bigint(0) NULL DEFAULT NULL COMMENT '数据模型ID',
`data_model` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '数据模型',
`resources` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '资源',
`perms` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '权限标识',
`perm_urls` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '路径',
`router_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '路由名称',
`icon` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '图标',
`sort` int(0) NULL DEFAULT NULL COMMENT '排序',
`type` int(0) NULL DEFAULT NULL COMMENT '类型',
`state` int(0) NULL DEFAULT NULL COMMENT '状态',
`version` int(0) NULL DEFAULT NULL COMMENT '版本',
`is_deleted` tinyint(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '是否删除',
`create_time` datetime(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '创建时间',
`create_user` bigint(0) NULL DEFAULT NULL COMMENT '创建人',
`update_time` datetime(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
`update_user` bigint(0) NULL DEFAULT NULL COMMENT '更新人',
`tenant_id` bigint(0) NULL DEFAULT NULL COMMENT '租户',
`client_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '客户端',
`trace_id` varchar(60) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT 'traceId',
`create_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
`update_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1895361118805815299 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for us_permission
-- ----------------------------
DROP TABLE IF EXISTS `us_permission`;
CREATE TABLE `us_permission` (
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '权限ID',
`menu_id` bigint(0) NULL DEFAULT NULL COMMENT '菜单ID',
`name` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '' COMMENT '权限名称',
`code` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT 'CODE',
`description` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '描述',
`level` int(0) NULL DEFAULT NULL COMMENT '等级',
`super_perm_id` bigint(0) NULL DEFAULT NULL COMMENT '上级权限ID',
`data_model_id` bigint(0) NULL DEFAULT NULL COMMENT '数据模型ID',
`data_model` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '数据模型',
`resources` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '资源',
`perms` varchar(500) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '权限标识',
`perm_urls` varchar(5000) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '路径',
`router_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '路由名称',
`icon` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '图标',
`sort` int(0) NULL DEFAULT NULL COMMENT '排序',
`type` int(0) NULL DEFAULT NULL COMMENT '类型',
`state` int(0) NULL DEFAULT NULL COMMENT '状态',
`version` int(0) NULL DEFAULT NULL COMMENT '版本',
`is_deleted` tinyint(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '是否删除',
`create_time` datetime(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '创建时间',
`create_user` bigint(0) NULL DEFAULT NULL COMMENT '创建人',
`update_time` datetime(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
`update_user` bigint(0) NULL DEFAULT NULL COMMENT '更新人',
`tenant_id` bigint(0) NULL DEFAULT NULL COMMENT '租户',
`client_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '客户端',
`trace_id` varchar(60) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT 'traceId',
`create_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
`update_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `unique_perms`(`perms`) USING BTREE COMMENT '权限值唯一'
) ENGINE = InnoDB AUTO_INCREMENT = 1824033075454050306 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for us_role_menu_perm
-- ----------------------------
DROP TABLE IF EXISTS `us_role_menu_perm`;
CREATE TABLE `us_role_menu_perm` (
`id` bigint(0) NOT NULL COMMENT '角色权限ID',
`role_id` bigint(0) NULL DEFAULT NULL COMMENT '角色ID',
`menu_perm_id` bigint(0) NULL DEFAULT NULL COMMENT '菜单权限ID',
`menu_id` bigint(0) NULL DEFAULT NULL COMMENT '菜单ID',
`perm_id` bigint(0) NULL DEFAULT NULL COMMENT '权限ID',
`perms` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '唯一权限标识',
`data_rules` varchar(2000) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '数据规则',
`data_sorts` varchar(2000) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '排序规则',
`op_fields` varchar(2000) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT '' COMMENT '可操作字段',
`eq_login_field` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '等于登录人字段',
`sort` int(0) NULL DEFAULT NULL COMMENT '排序',
`type` int(0) NULL DEFAULT NULL COMMENT '类型',
`state` int(0) NULL DEFAULT NULL COMMENT '状态',
`version` int(0) NULL DEFAULT NULL COMMENT '版本',
`is_deleted` tinyint(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '是否删除',
`create_time` datetime(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '创建时间',
`create_user` bigint(0) NULL DEFAULT NULL COMMENT '创建人',
`update_time` datetime(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
`update_user` bigint(0) NULL DEFAULT NULL COMMENT '更新人',
`tenant_id` bigint(0) NULL DEFAULT NULL COMMENT '租户',
`trace_id` varchar(60) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT 'traceId',
`create_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
`update_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',
PRIMARY KEY (`id`) USING BTREE,
INDEX `normal_role_id`(`role_id`) USING BTREE,
INDEX `normal_perm_id`(`perm_id`) USING BTREE,
INDEX `menu_id`(`menu_id`) USING BTREE,
INDEX `menu_perm_id`(`menu_perm_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for us_role_menus
-- ----------------------------
DROP TABLE IF EXISTS `us_role_menus`;
CREATE TABLE `us_role_menus` (
`id` bigint(0) NOT NULL COMMENT '角色权限ID',
`role_id` bigint(0) NULL DEFAULT NULL COMMENT '角色ID',
`menu_id` bigint(0) NULL DEFAULT NULL COMMENT '菜单ID',
`sort` int(0) NULL DEFAULT NULL COMMENT '排序',
`type` int(0) NULL DEFAULT NULL COMMENT '类型',
`state` int(0) NULL DEFAULT NULL COMMENT '状态',
`version` int(0) NULL DEFAULT NULL COMMENT '版本',
`is_deleted` tinyint(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '是否删除',
`create_time` datetime(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '创建时间',
`create_user` bigint(0) NULL DEFAULT NULL COMMENT '创建人',
`update_time` datetime(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
`update_user` bigint(0) NULL DEFAULT NULL COMMENT '更新人',
`tenant_id` bigint(0) NULL DEFAULT NULL COMMENT '租户',
`trace_id` varchar(60) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT 'traceId',
`create_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
`update_user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',
PRIMARY KEY (`id`) USING BTREE,
INDEX `normal_role_id`(`role_id`) USING BTREE,
INDEX `menu_id`(`menu_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;
目标表
- us_menu_perm
- 存储所有可用的权限标识及其对应的菜单ID。
- us_role_menu_perm
- 存储角色与菜单权限之间的关系,即哪些角色拥有哪些权限。
三、转换
1、最终效果图
2、导入菜单权限
获取文件名
在输入中找到‘获取文件名’,拖入到画布中配置文件名,选择文件目录,配置文件名的正则表达式 ^.*.xlsx$ ,最后点击增加按钮,加入到下方的已经选择的文件名称中。
查看显示文件名称
查看预览数据,找到文件路径的字段名称‘filename’
Excel输入
在输入中找到‘Excel输入’,并拖入画布中,将‘获取文件名’与‘Excel输入’连接选择步骤名称‘获取文件名’
选择文件名的字段名‘filename’
预览数据
右键选择对象,点击preview
选择‘快速启动’
可以看到数据已经加载进来
生成雪花算法ID
在脚本中找到‘JavaScript代码’,拖入画布var UAPID = Packages.cn.hutool.core.util.IdUtil.getSnowflake(0,0).nextId()
使用hutool的方法生成雪花算法ID
如果没有hutool的包会提示报错,需要将hutool的jar包放入PDI的lib目录中
preview预览数据 UAPID已经生成
过滤记录
在流程中找到‘过滤记录’,拖入画布中过滤‘ 权限标识 不等于 空 且 菜单ID 不等于 空’的数据
点击加号,选择字段名称
选择条件为‘NOT’,value类型选择‘String’,值为空
条件之间选择‘AND’
右键选择可以删除条件
preview预览数据,可以看到空值已经没有了
排序记录
由于需要将excel表中的数据和数据库表中的数据进行关联,所以必须先将两个表的数据进行排序在转换中‘排序记录’拖入画布中
定义步骤的名称,点击获取字段,会从上一步骤中添加所有字段进来
找到需要排序的字段,也就是指两个表的关联字段,右键选择‘只保留选中的行’
表输入
在输入中找到‘表输入’,拖入画布中先定义步骤名称,新建数据源
定义数据源名称,选择连接类型为‘MySQL’,连接方式JDBC,配置连接信息,最后点击测试
选择获取SQL查询语句
选择需要用到的关联表‘us_permission’
点击预览查看数据
对这张表同样进行上面的排序步骤
记录集连接
在连接中找到‘记录集连接’,拖入画布中定义步骤名称
选择excel表作为主表,permission表作为左连接表
选择连接类型为左连接,选择连接字段
perview预览数据,已经通过perms字段将两张表的数据关联起来
表输出
在输出中找到‘表输出’,拖入画布中定义步骤名称,选择数据库,选择输出的数据表,勾选指定数据库字段,勾选使用批量插入
点击获取字段,保留所需的字段
点击输入字段映射,选择源字段与目标字段并添加
四、运行
点击左上角三角按钮,运行这个转换,可以在下方看到执行结果的日志数据库中查看表,数据已经添加成功