Kettle 小白入门指南:从A表到B表的数据清洗实战
Kettle 小白入门指南:从A表到B表的数据清洗实战
🤔 什么是 Kettle?
想象一下,你的公司有很多数据散落在不同的地方:
- 订单数据在 MySQL 数据库
- 客户信息在 Excel 表格
- 日志文件在服务器上
现在老板要你把这些数据整合到一起做分析报表,怎么办?
Kettle 就是来解决这个问题的!
用人话说:
Kettle 就像一个"数据搬运工",它能帮你:
- 📥 从各种地方读取数据(数据库、Excel、文件…)
- 🧹 清洗数据(去重、去空格、格式化…)
- 🔄 转换数据(计算、合并、拆分…)
- 📤 写入到目标位置(另一个数据库、文件…)
最重要的是:不用写代码! 全程鼠标拖拽,像搭积木一样简单。
🍳 Kettle 的"厨房家族"
Kettle 项目很有趣,用厨房用具命名:
| 工具 | 中文 | 作用 | 就像… |
|---|---|---|---|
| Spoon | 勺子 | 图形化设计工具 | Word 的编辑界面 |
| Pan | 平底锅 | 命令行执行器 | 双击运行程序 |
| Kitchen | 厨房 | 作业调度器 | 定时任务 |
小白只需要会用 Spoon 就够了!
💼 真实案例:清洗历史订单数据
背景故事
小明在一家电商公司工作,数据库里有一张 old_orders 表,存了 5 年的订单数据(200 万条)。
老板的要求:
“把 2025 年之前的历史订单,清洗干净后放到
clean_orders表,方便做数据分析。”
具体需求:
- 只要 2024 年 12 月 31 日之前的数据
- 去掉金额为 0 的无效订单
- 去掉重复的订单
- 手机号要脱敏(中间 4 位变成
****) - 去除字段中的多余空格
小明不会写 SQL 脚本?没关系,用 Kettle 10 分钟搞定!
🚀 实战步骤(超详细)
Step 1: 安装 Kettle
-
下载:
- 官网:https://sourceforge.net/projects/pentaho/
- 下载
pdi-ce-9.x.zip(免费版)
-
解压:
解压到任意目录,比如: D:\kettle\ -
启动 Spoon:
- Windows:双击
Spoon.bat - Mac/Linux:运行
./spoon.sh
- Windows:双击
-
第一次启动会弹出欢迎界面,点击"新建转换"
Step 2: 连接数据库
在 Spoon 左侧:
1. 右键点击"数据库连接" → "新建"
2. 填写信息:- 连接名称:MyDB- 连接类型:MySQL- 主机名称:localhost- 数据库名称:shop_db- 端口:3306- 用户名:root- 密码:******
3. 点击"测试" → 显示"连接成功" → 确定
Step 3: 设计数据清洗流程
整体流程图:
┌─────────────┐
│ ① 表输入 │ 从 old_orders 读取数据
│ (读取A表) │
└──────┬──────┘↓
┌─────────────┐
│ ② 过滤记录 │ 只要 2025 年前 & 金额 > 0
└──────┬──────┘↓
┌─────────────┐
│ ③ 字符串操作│ 去空格、手机号脱敏
└──────┬──────┘↓
┌─────────────┐
│ ④ 唯一行 │ 按订单号去重
└──────┬──────┘↓
┌─────────────┐
│ ⑤ 排序记录 │ 按日期排序
└──────┬──────┘↓
┌─────────────┐
│ ⑥ 表输出 │ 写入 clean_orders
│ (写入B表) │
└─────────────┘
Step 4: 详细配置每一步
① 表输入(读取 A 表)
在左侧找到 “核心对象” → “输入” → “表输入”,拖到画布上。
双击配置:
-- 连接:选择刚才创建的 MyDB
-- SQL 查询:
SELECT order_id, -- 订单号user_name, -- 用户名phone, -- 手机号order_amount, -- 订单金额order_date -- 下单日期
FROM old_orders
WHERE order_date < '2025-01-01' -- 只要2025年前的数据
💡 小技巧: 点击"预览"按钮,可以看到前 1000 条数据
② 过滤记录
拖入 “转换” → “过滤记录”,连接到上一步。
配置条件:
发送"真"数据到的步骤:下一步
发送"假"数据到的步骤:(不连接,自动丢弃)条件设置:
order_amount > 0 AND phone IS NOT NULL
这样就过滤掉了:
- ❌ 金额为 0 的订单
- ❌ 手机号为空的订单
③ 字符串操作(清洗数据)
拖入 “转换” → “字符串操作”
配置:
| 字段名 | 操作 | 说明 |
|---|---|---|
| user_name | 去除两端空白 | 去掉名字前后的空格 |
| phone | 去除两端空白 | 去掉手机号空格 |
再拖入 “脚本” → “替换字符串” 来脱敏手机号:
字段:phone
查找:^(\d{3})\d{4}(\d{4})$ (正则表达式)
替换为:$1****$2
使用正则表达式:✓结果:
138 1234 5678 → 138****5678
④ 唯一行(去重)
拖入 “转换” → “唯一行(哈希值)”
配置:
用来比较的字段:
☑ order_id (按订单号去重)去重选项:
○ 保留第一行(保留最早的记录)
⑤ 排序记录
拖入 “转换” → “排序记录”
配置:
排序字段:order_date
升序:✓ (从旧到新)
⑥ 表输出(写入 B 表)
拖入 “输出” → “表输出”
配置:
连接:MyDB
目标表:clean_orders
提交记录数量:1000 (每1000条提交一次,提高性能)☑ 指定数据库字段 (让Kettle自动匹配字段)如果目标表不存在:
点击"SQL"按钮 → 自动生成建表语句 → 执行
Step 5: 连接各个步骤
- 按住 Shift 键
- 点击 “表输入” 不放
- 拖动到 “过滤记录” 上释放
- 重复操作连接所有步骤
你会看到类似这样的流程图:
[表输入] → [过滤记录] → [字符串操作] → [唯一行] → [排序] → [表输出]
Step 6: 测试运行
- 点击工具栏的 绿色播放按钮 ▶️
- 弹出执行配置窗口,保持默认,点击"启动"
查看执行日志:
表输入.0 - 读取了 150000 行
过滤记录.0 - 过滤掉 5000 行
唯一行.0 - 去重了 2000 行
表输出.0 - 写入了 143000 行执行结束,用时:2分15秒
错误数:0
✅ 成功! 历史数据已经清洗完毕
📊 实际执行效果对比
A 表(old_orders)- 清洗前
| order_id | user_name | phone | order_amount | order_date |
|---|---|---|---|---|
| 1001 | 张三 | 13812345678 | 199.00 | 2024-06-15 |
| 1002 | 李四 | 13987654321 | 0.00 | 2024-07-20 |
| 1003 | 王五 | 13612349876 | 350.00 | 2024-08-10 |
| 1001 | 张三 | 13812345678 | 199.00 | 2024-06-15 |
问题:
- ❌ 有金额为 0 的无效订单(1002)
- ❌ 有重复订单(1001 出现两次)
- ❌ 名字有多余空格("李四 ")
B 表(clean_orders)- 清洗后
| order_id | user_name | phone | order_amount | order_date |
|---|---|---|---|---|
| 1001 | 张三 | 138****5678 | 199.00 | 2024-06-15 |
| 1003 | 王五 | 136****9876 | 350.00 | 2024-08-10 |
改进:
- ✅ 去除了金额为 0 的订单
- ✅ 去除了重复订单
- ✅ 去除了多余空格
- ✅ 手机号已脱敏
🎯 保存与定时执行
保存 Transformation
文件 → 保存为...
保存位置:D:\kettle\jobs\clean_orders.ktr
.ktr 就是 Kettle Transformation 文件
定时执行(可选)
如果需要每天自动执行:
Windows 计划任务:
1. 创建批处理文件 run.bat:@echo offcd D:\kettlepan.bat /file:"D:\kettle\jobs\clean_orders.ktr"2. 打开"任务计划程序"
3. 创建基本任务 → 每天凌晨 2 点执行 run.bat
Linux crontab:
# 编辑定时任务
crontab -e# 添加:每天凌晨2点执行
0 2 * * * /opt/kettle/pan.sh -file=/data/jobs/clean_orders.ktr
💡 小白常见问题 FAQ
Q1: Kettle 需要编程基础吗?
答:不需要!
- 90% 的功能都是拖拽配置
- 只需要会写简单的 SQL 查询
- 复杂逻辑可以用内置的 JavaScript 步骤(可选)
Q2: 能处理多大的数据量?
答:看情况
| 数据量 | 处理时间 | 建议 |
|---|---|---|
| 1万条 | 几秒钟 | 无压力 |
| 10万条 | 1-2分钟 | 适合 |
| 100万条 | 10-30分钟 | 推荐 |
| 1000万条+ | 1小时+ | 考虑分批或用 Spark |
Q3: 出错了怎么调试?
答:Kettle 提供了强大的调试功能
- 预览数据: 每个步骤右键 → 预览 → 看前 1000 行
- 查看日志: 执行窗口有详细的错误信息
- 单步执行: 可以暂停、单步执行查看数据流
常见错误:
- 数据库连接失败 → 检查 IP、端口、用户名密码
- 字段不存在 → 检查 SQL 和目标表字段是否匹配
- 内存溢出 → 调整
Spoon.bat中的内存参数
Q4: 和写 SQL 脚本比有什么优势?
Kettle 的优势:
- ✅ 可视化,容易理解和维护
- ✅ 支持多种数据源(不只是数据库)
- ✅ 内置几百种转换组件
- ✅ 不需要编译,改完就能跑
- ✅ 有图形化日志和监控
SQL 脚本的优势:
- ✅ 执行效率更高
- ✅ 适合简单的数据迁移
- ✅ 版本管理方便(Git)
建议: 中等复杂度的 ETL 用 Kettle,超大数据量或简单迁移用 SQL
🎓 进阶学习路径
掌握了本案例后,你可以继续学习:
入门级(1-2周)
- ✅ 各种输入输出(Excel、CSV、JSON)
- ✅ 常用转换步骤(计算、合并、查找)
- ✅ 简单的 Job 调度
中级(1-2个月)
- 📊 数据仓库建模
- 🔀 复杂的数据转换逻辑
- 🐘 大数据集成(Hadoop、Hive)
高级(3-6个月)
- 🔄 增量抽取(CDC)
- 🌐 分布式执行(Carte)
- 📈 性能优化技巧
🎉 总结
通过这个案例,你应该已经了解:
- Kettle 是什么: 一个不用编程的 ETL 工具
- Spoon 是什么: Kettle 的图形化设计器
- 怎么用: 拖拽步骤 → 配置参数 → 连接 → 运行
- 能做什么: 从 A 表读取 → 清洗转换 → 写入 B 表
关键要点:
- 🥄 用 Spoon 像搭积木一样设计数据流程
- 🧹 从读取、清洗、转换到输出,每一步都可视化
- 📈 适合处理中等规模(百万级)的数据
- 🕐 可以定时自动执行
现在就打开 Spoon,开始你的第一个 ETL 之旅吧! 🚀
有问题随时查看日志,Kettle 会告诉你哪里出错了。记住:所有的 ETL 高手都是从拖拽第一个"表输入"开始的!
