数据转换的艺术: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字段将两张表的数据关联起来

表输出

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

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

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

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

四、运行

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rainbow酱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值