Kettle入门:5分钟实现Excel到MySQL的ETL数据搬运 简介本资源是一份面向1–3年经验研发人员的KettlePentaho Data Integration入门级教学PPT聚焦ETL核心流程与数据同步实践帮助开发者快速掌握开源ETL工具的安装、核心概念与工程化落地要点。内容涵盖ETL原理、Kettle 9.2版本实操演示、目录结构解析、转换Transformation与作业Job设计逻辑、数据库连接配置、数据流机制跳/Hop、分发与复制、元数据管理及调优注意事项并明确指出其在复杂场景下的能力边界。压缩包仅含1个859KB的pptx文件结构清晰、图文并茂适合作为课堂讲义或自学提纲所有知识点均围绕MySQL/Oracle等主流数据库环境展开强调结合真实数据库调试实践。目前已有1463人学习下载是初学者建立Kettle系统性认知、理解数据抽取—转换—加载全流程的高性价比入门材料。1. 什么是 Kettle——一个“数据搬运工”的真实日常你有没有遇到过这样的场景公司里销售系统用 MySQL客户资料在 Excel 表格里订单日志存在服务器上的 CSV 文件中而老板突然说“把这三块数据按‘客户ID最近30天订单总额行业分类’汇总成一张表明天早上发我”这时候你打开 Excel 手动复制粘贴、写 VLOOKUP、再导出……两小时后发现漏了 7 条数据重来第三遍跑完发现 Excel 日期格式错乱又得调格式最后导进数据库时字段类型不匹配报错退出——整个过程像在拼一幅没说明书的乐高每块都对得上但就是卡在最后一扣。Kettle 就是那个帮你把“拼乐高”变成“按图纸自动组装”的工具。它不是编程语言也不是数据库而是一个专为数据搬运设计的图形化流水线控制器你不用写 for 循环不用记 JDBC 驱动类名更不用手动处理日期格式转换或空值替换——只要在界面上拖两个框比如“读 CSV”和“写 MySQL”连一根线点一下运行它就自动把文件里的数据抽出来、把手机号补全、把金额统一成小数点后两位、把重复客户去重再稳稳当当塞进数据库里。它不替代你思考业务逻辑但它把你从“手工搬运工”解放成“流水线调度员”。这份 PPT 讲解资源就是带你从零开始亲手搭出第一条能跑通的搬运流水线——哪怕你今天连“ETL”三个字母都念不全也能在 20 分钟内让 Kettle 把一个 Excel 表里的名字原封不动地存进本地数据库。2. 先搞懂一个概念ETL 不是黑匣子而是三步标准动作很多人一听到 ETL 就皱眉觉得是“大数据才配碰的玄学”。其实它只是三个非常朴实的动作每天都在你电脑里发生只是以前你用手干现在让 Kettle 干2.1 Extract抽取不是“复制粘贴”而是“精准抓取”想象你要从 5 个不同快递柜取包裹有的要扫码开柜MySQL 数据库有的要输取件码Excel 文件有的要刷身份证API 接口还有的得翻纸质登记本CSV 日志。Extract 就是 Kettle 帮你统一管理这 5 种取件方式——它不关心柜子在哪、密码多长只认“协议”MySQL 用 JDBC 协议Excel 用 Apache POI 协议API 用 HTTP 协议。你只需告诉它“去 192.168.1.100 的 MySQL 里查 sales_order 表条件是 create_time ‘2024-01-01’”它就自动连上去、执行 SQL、把结果打包成“数据行”吐出来。提示Kettle 的抽取能力之所以强是因为它把“怎么连”和“取什么”彻底分开。连数据库填个 IP、端口、用户名、密码就行取数据写一句 SQL 或勾选字段即可。不用背驱动类名也不用担心 ClassNotFound。2.2 Transform转换不是“写 Python 脚本”而是“搭积木式加工”拿到原始数据后往往不能直接用。比如销售表里“客户电话”字段有的带区号021-12345678有的没横杠02112345678有的甚至混着英文TEL:12345678——老板要的却是统一 11 位纯数字。在 Kettle 里你不需要写正则表达式而是拖一个叫“字符串操作”的步骤勾选“移除所有非数字字符”再拖一个“字段选择”步骤把处理后的字段重命名为 phone_clean。整个过程就像在 Excel 里点“数据→分列→文本转数字”但它是全自动、可复用、能记录元数据的。其他常见转换动作Kettle 都预置了对应积木清洗类去除空格、替换空值、过滤掉测试数据如 name test计算类新增字段order_amount * 0.9、日期加减create_time 30 days整合类把客户表和订单表按 customer_id 关联类似 SQL JOIN结构类把一行“订单ID,商品A数量,商品B数量”拆成三行“订单ID,商品A,数量”行转列2.3 Load装载不是“手动导入”而是“一次配置永久生效”最后一步是把加工好的数据安全、稳定、可追溯地放进目标地。Kettle 支持两种主流方式全量覆盖清空目标表再把新数据全部写入适合每日快照表增量更新只写入新增或变更的数据比如用 update key 判断是否已存在存在则 update不存在则 insert关键在于Kettle 会自动记录每次装载的行数、耗时、错误详情并生成日志文件PDI.log。下次老板问“昨天的报表为什么少 200 条”你不用翻聊天记录直接打开日志搜ERROR就能看到是哪条数据的手机号格式非法被跳过了——这比 Excel 里“报错无法完成此操作”强了不止一个量级。3. 为什么选 Kettle——不是因为它最炫而是因为它最“省心”市面上 ETL 工具不少商业的 Informatica、DataStage 功能强大但贵开源的 Talend 界面现代但学习曲线陡。KettlePDI能在企业中活下来、且被大量中小团队选用靠的是三个“不折腾”3.1 不折腾环境绿色免装Java 有就能跑你不需要管理员权限不用改系统变量甚至不用联网——下载一个压缩包约 300MB解压后双击spoon.batWindows或spoon.shLinux/Mac界面就弹出来了。它底层是 Java 写的所以只要你电脑上装了 JDK 8 或以上绝大多数开发机都默认有它就能启动。没有“安装失败”“依赖缺失”“DLL 找不到”的玄学报错。某导师第一次教新人时让 15 个人同时在各自笔记本上解压运行14 个秒开1 个打不开——查了 5 分钟发现他装的是 JDK 17而 PDI 9.2 默认适配 JDK 11换回 JDK 11 后立刻正常。这种“版本兼容性问题”是 Kettle 唯一需要你稍微留意的环境门槛。3.2 不折腾语法拖拽连线逻辑即所见传统写 ETL 脚本得先学 SQL再学 Shell再学 Python Pandas最后还得懂数据库事务。Kettle 把这一切封装成“可视化积木”每个步骤Step就是一个功能明确的盒子比如“表输入”“JSON 输入”“HTTP 客户端”每根连线Hop就是一条单向数据通道箭头方向数据流向右键点击连线还能设置“仅当上一步成功才走这条线”或“无论成败都走”相当于图形化的 if/else这意味着你不需要记住pandas.read_csv()的参数也不用查mysql-connector的 commit 方法。你看到什么就做什么。某跨平台系统项目组曾让一位刚毕业的测试同学用 3 天时间学会 Kettle独立维护 8 个数据同步任务——她之前连 SQL SELECT 都写不利索但她说“拖两个框连根线点运行看到数据库里多了数据我就信了。”3.3 不折腾维护转换Transformation和作业Job分工明确这是新手最容易混淆、也最该第一时间建立的认知Transformation转换专注“数据怎么变”。它里面只有步骤Step和跳Hop所有步骤并发执行像工厂流水线上的多个工人同时干活。它处理的是“数据行”单位是 record。Job作业专注“事情怎么串”。它里面是“作业项”Job Entry比如“运行一个转换”“发送邮件”“执行 Shell 脚本”“检查文件是否存在”。作业项按顺序执行像项目经理排工期先跑转换 A成功后再跑转换 B失败就发告警邮件。举个真实例子同步聊天记录到星网总库。转换trans_chat_sync负责从 Web API 拉 JSON → 解析出 user_id、msg_content、send_time → 过滤掉测试账号 → 把 send_time 转成数据库要求的 datetime 格式 → 写入 MySQL作业job_daily_chat_sync负责① 检查昨天的 chat_20240520.json 文件是否存在 → ② 存在则运行 trans_chat_sync → ③ 运行完发一封“同步完成共 12,487 条”的邮件 → ④ 无论成败把日志压缩归档这种分工让复杂流程变得可拆解、可定位、可复用。你改数据逻辑只动转换你调执行顺序或加告警只动作业——互不干扰。4. 第一个例子5 分钟跑通“Excel → MySQL”搬运流水线现在我们动手搭第一条真正能跑通的流水线。目标很朴素把一个本地 Excel 文件sales_2024Q1.xlsx里的销售数据原样存进你本机 MySQL 的sales_q1表中。全程不写一行代码只靠鼠标拖拽。4.1 准备工作三样东西缺一不可Kettle 9.2 安装包从官方 SourceForge 下载链接见资源摘要解压到任意路径比如D:\kettle\pdi-ce-9.2.0.0-290MySQL 数据库确保你本地已安装 MySQL 5.7并创建好数据库etl_demo和用户etl_user密码etl123示例 Excel 文件新建一个 Excel第一行写字段名order_id,customer_name,amount,order_date第二行起填几条测试数据如ORD-001,张三,2999.5,2024/01/15保存为sales_2024Q1.xlsx放在D:\kettle\data\目录下注意MySQL 用户必须有etl_demo库的 INSERT 权限。如果不会授权用 root 登录后执行CREATE DATABASE etl_demo CHARACTER SET utf8mb4; CREATE USER etl_userlocalhost IDENTIFIED BY etl123; GRANT INSERT ON etl_demo.* TO etl_userlocalhost; FLUSH PRIVILEGES;4.2 启动 Spoon新建转换双击D:\kettle\pdi-ce-9.2.0.0-290\spoon.bat等待界面加载完成首次启动稍慢。点击菜单栏文件 → 新建 → 转换空白画布出现。这就是你的流水线车间。4.3 拖拽第一步“Excel 输入”在左侧面板“核心对象”→“输入”里找到“Excel 输入”拖到画布中央。双击它弹出配置窗口文件选项卡点击“浏览”→“浏览文件”找到D:\kettle\data\sales_2024Q1.xlsx工作表选项卡默认选第一个 sheetSheet1保持不变内容选项卡勾选“首行作为字段名”这样第一行order_id就自动变成字段名点击“确定”此时画布上出现一个蓝色方块写着“Excel 输入”。它已经知道要去哪找文件、怎么读——但还没告诉它“读完给谁”。4.4 拖拽第二步“表输出”并连线在“核心对象”→“输出”里找到“表输出”拖到画布右侧。双击它数据库连接点击右侧“新建”按钮 → 类型选“MySQL” → 填写主机名localhost数据库名etl_demo用户名etl_user密码etl123点击“测试连接”看到“连接成功”提示再点“确定”回到表输出配置目标表输入sales_q1这个表 Kettle 会自动帮你创建无需提前建字段映射点击右下角“获取字段”按钮它会自动从 Excel 读取字段名并映射到表的列。确认无误后点“确定”现在把鼠标移到“Excel 输入”方块右边缘按住左键拖出一根线松开在“表输出”方块左边缘——一根带箭头的连线就生成了。这表示Excel 读出的数据行将流向表输出步骤。4.5 运行看它真正在干活点击工具栏绿色三角形“运行”按钮或按 CtrlR。弹出“运行配置”窗口保持默认点“运行”。下方“执行结果”面板开始滚动日志2024/05/20 10:23:45 - Excel 输入.0 - Finished reading query, closing connection. 2024/05/20 10:23:45 - 表输出.0 - Connecting to database [etl_demo]... 2024/05/20 10:23:46 - 表输出.0 - Inserting row into table [sales_q1]... 2024/05/20 10:23:46 - 表输出.0 - Finished processing (I4, O4, R4, W4, U0, E0)最后这行I4, O4, R4, W4是关键Input4 行Output4 行Read4 行Write4 行——说明 4 条数据已成功写入。打开 MySQL 客户端如 Navicat 或命令行执行SELECT * FROM etl_demo.sales_q1;你会看到 Excel 里的 4 条数据整整齐齐躺在数据库里。提示如果报错“Unknown column order_date in field list”大概率是 Excel 里日期列被识别成了字符串。解决方法在“Excel 输入”配置的“内容”选项卡里把order_date字段的“类型”手动改成Date并设置格式为yyyy/MM/dd。Kettle 的字段类型推断有时不准手动指定是血泪经验。5. 新手必踩的 5 个坑避开了你就比 80% 的人走得稳刚上手 Kettle最大的挫败感不是“做不出来”而是“明明按教程做了却卡在某个莫名其妙的报错上”。以下是某高校数据实验室带 32 名学员实测总结的最高频 5 个坑每一条都附带“现象→原因→解法”照着做省下至少 3 小时排查时间5.1 现象双击spoon.bat没反应或弹出一闪而过的黑窗就消失原因系统找不到 Java 环境或 JDK 版本与 PDI 9.2 不兼容PDI 9.2 官方推荐 JDK 11解法命令行输入java -version确认输出是java version 11.0.x如果是 JDK 17 或更高去官网下载 JDK 11Adoptium Temurin 11安装后修改spoon.bat文件在第一行echo off下面添加set JAVA_HOMEC:\Program Files\Eclipse Adoptium\jdk-11.0.x-hotspot set PATH%JAVA_HOME%\bin;%PATH%路径按你实际 JDK 11 安装位置调整保存后重新双击运行5.2 现象“表输出”步骤报错Access denied for user etl_userlocalhost原因MySQL 用户权限不足或密码包含特殊字符如、$、!未被正确解析解法用 root 登录 MySQL执行GRANT ALL PRIVILEGES ON etl_demo.* TO etl_userlocalhost; FLUSH PRIVILEGES;如果密码含特殊字符在“表输出”的数据库连接配置中把密码用英文单引号括起来如etl1235.3 现象Excel 输入后中文字段名或数据全是乱码如??、原因Excel 文件保存编码不是 UTF-8或 Kettle 未指定正确编码解法用 Excel 另存为 → 选择“CSV UTF-8逗号分隔(*.csv)”格式再用“CSV 文件输入”步骤替代“Excel 输入”或在“Excel 输入”配置的“内容”选项卡里勾选“编码”并设为UTF-85.4 现象转换运行成功但数据库里数据为空W0或只有部分字段写入原因字段名大小写不一致或 Excel 表头有隐藏空格解法在“Excel 输入”配置的“字段”选项卡里逐个检查字段名把Order_ID改成小写order_idMySQL 默认不区分大小写但 Kettle 映射严格用 Excel 的TRIM(A1)函数清理表头空格或直接手动删掉字段名前后空格5.5 现象运行时卡在Connecting to database...十几秒后报超时原因MySQL 的wait_timeout设置过短默认 28800 秒8 小时但某些云数据库可能设为 60 秒连接被服务端主动断开解法用 root 登录 MySQL执行SET GLOBAL wait_timeout 28800; SET GLOBAL interactive_timeout 28800;更稳妥的做法在“表输出”的数据库连接配置中点击“高级”选项卡在“连接 URL”末尾加上?connectTimeout30000socketTimeout60000单位毫秒6. 下一步学什么——从“能跑通”到“敢上线”的进阶路径当你已经成功把 Excel 数据搬进数据库恭喜你已经跨过了 Kettle 最高的那道门槛。接下来别急着学“集群部署”或“Kafka 集成”——那些是锦上添花而你现在最需要的是把流水线从“玩具”变成“生产可用”。以下是为你量身定制的 3 个进阶动作每个都能立刻提升你的实战价值6.1 动作一给流水线装上“后悔药”——参数化与变量你现在硬编码了 Excel 路径和数据库密码这意味着换台电脑就得改路径测试库和生产库要维护两套转换密码明文写在文件里不安全解决方案用变量替代硬编码。在转换空白处右键 → “编辑转换设置” → “参数”选项卡 → 添加两个参数INPUT_FILE_PATH默认值D:/kettle/data/sales_2024Q1.xlsxDB_PASSWORD默认值etl123然后回到“Excel 输入”配置在“文件”选项卡的“文件名”框里把路径改成${INPUT_FILE_PATH}回到“表输出”的数据库连接密码框改成${DB_PASSWORD}。这样你就可以通过命令行一键切换环境# 在测试环境运行 pan.sh -filesales_sync.ktr -param:INPUT_FILE_PATH/home/test/data/test.xlsx -param:DB_PASSWORDtest123 # 在生产环境运行密码由运维提供你无需知道 pan.sh -filesales_sync.ktr -param:INPUT_FILE_PATH/data/prod/sales.xlsx -param:DB_PASSWORD${PROD_DB_PASS}从那以后我每次新建转换都强制走一遍“参数化”流程先列所有可能变化的值路径、库名、表名、阈值再统一定义为参数。哪怕当时用不上也比上线前手忙脚乱改 10 个地方强。6.2 动作二让流水线“自己说话”——日志与监控落地PPT 里提到PDI.log但新手常忽略日志不是摆设而是你的第一道防线。关键日志位置D:\kettle\pdi-ce-9.2.0.0-290\logs\PDI.logWindows或同级logs/目录必查三类信息ERROR红色字体直接定位失败步骤Finished processing (I..., W...)确认数据量是否符合预期比如 I1000 但 W998说明 2 条因主键冲突被跳过Execution time记录耗时为后续调优提供基线更进一步可以配置 Kettle 将日志写入数据库表在“作业”里添加一个“SQL 脚本”作业项内容为INSERT INTO etl_log (job_name, status, start_time, end_time, rows_read, rows_written, duration_ms) VALUES (${Internal.Job.Name}, ${Internal.Job.Status}, NOW(), NOW(), ${Internal.Job.Rows.Read}, ${Internal.Job.Rows.Written}, ${Internal.Job.Execution.Time});这样所有任务的执行记录都自动沉淀老板问“上周五的同步为什么慢”你打开etl_log表按时间排序一眼看到那条耗时 320 秒的记录再查对应PDI.log问题立现。6.3 动作三把“单次搬运”升级为“定时流水线”——用作业串联调度现在你只能手动点“运行”但真实业务需要每天凌晨 2 点自动拉前一天的销售数据拉完后自动发邮件通知运营同事如果失败自动重试 2 次再失败则短信告警这就必须用到Job作业。新建一个作业按顺序添加“转换”作业项指向你刚做好的sales_sync.ktr“邮件”作业项配置 SMTP 服务器、收件人、标题如“销售同步完成${Internal.Job.Rows.Written} 条”“检查数据库连接”作业项放在最前确保 MySQL 可达不可达则跳过后续步骤并记录然后用系统自带的定时任务Windows 任务计划程序 / Linux crontab调用kitchen.sh# Linux 每天凌晨 2 点执行 0 2 * * * /opt/kettle/kitchen.sh -file/opt/kettle/jobs/daily_sales.kjb -levelBasic /var/log/kettle/daily_sales.log 21从那以后我每次交付数据同步需求都坚持“作业先行”先搭好带邮件、带重试、带日志的作业框架再往里填转换。因为业务方永远不关心你用了什么技术他们只关心数据准不准、来得及时不及时、出问题能不能马上知道。希望帮到你。本文还有配套的精品资源点击获取