数据转换的艺术:Kettle(PDI)带来的无限可能与我的实战经验分享(一)

一、Kettle(PDI)简介

Kettle(Pentaho Data Integration, PDI)是一个强大的开源ETL工具,它通过提供图形化界面让用户能够轻松地设计和管理数据集成流程。在Kettle中,控件通常被称为步骤(Steps)或作业项(Job Entries),它们是构建转换(Transformation)和作业(Job)的基本单元。以下是关于Kettle(PDI)的一些常见控件的详细介绍:

转换中的步骤(Steps)

  1. 表输入(Table Input)
    • 从数据库表中读取数据。支持SQL查询来选择特定的数据。
  2. 文本文件输入/输出(Text File Input/Output)
    • 用于导入或导出大型文本文件,如CSV、TXT等。可以配置源平面文件的类型、行分隔符和编码等属性。
  3. 过滤记录(Filter Rows)
    • 根据条件筛选记录,例如只保留满足某些业务规则的数据行。
  4. 排序记录(Sort Rows)
    • 对数据流中的记录进行排序,可以根据一个或多个字段进行升序或降序排列。
  5. 合并记录(Merge Rows)
    • 合并两个不同的数据流,通常用于比较新旧数据集之间的差异。
  6. JavaScript修改(Modified JavaScript Value)
    • 提供了自定义逻辑的功能,可以用来计算新的字段值、执行复杂的数据转换等。
  7. 字段选择(Select Values)
    • 允许选择、重命名、移除或重新排序输入流中的字段,对于数据清洗非常有用。
  8. 分组(Group By)
    • 对输入数据进行分组汇总,可以基于一个或多个字段对数据进行聚合计算,如求和、计数等。
  9. 数据库查询(Database Lookup)
    • 在转换过程中查询数据库以获取额外的信息,这对于丰富原始数据集很有帮助。
  10. 表输出(Table Output)
    • 将处理后的数据写入目标数据库表中,提供了丰富的选项来控制如何插入或更新记录。

作业中的作业项(Job Entries)

  1. 启动(Start)
    • 作业的开始点,表示作业从此处开始执行。
  2. 转换(Transformation)
    • 可以在一个作业中运行一个或多个转换,允许复杂的流程控制。
  3. 成功(Success)
    • 表示作业结束,并且所有之前的步骤都成功完成。
  4. ShellExecute a Process
    • 允许在作业中执行外部命令或脚本,如shell脚本、批处理文件等。
  5. 邮件(Mail)
    • 发送电子邮件通知,可以在作业完成后发送状态报告或警报。
  6. 等待(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;

目标表

  1. us_menu_perm
    • 存储所有可用的权限标识及其对应的菜单ID。
  2. 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字段将两张表的数据关联起来

表输出

在输出中找到‘表输出’,拖入画布中

定义步骤名称,选择数据库,选择输出的数据表,勾选指定数据库字段,勾选使用批量插入

点击获取字段,保留所需的字段

点击输入字段映射,选择源字段与目标字段并添加

四、运行

点击左上角三角按钮,运行这个转换,可以在下方看到执行结果的日志

数据库中查看表,数据已经添加成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rainbow酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值