
简介在高校数据预处理课程或课程设计中KettlePentaho Data Integration是常用的图形化ETL工具适合用来完成数据清洗、转换与集成等系列任务。此份作业资料包面向正在学习数据分析与ETL流程的学生完整收录了瑞翼工坊课程配套的实践内容。压缩包内共9个文件整体大小约136.82MB核心组成包括6个SQL数据源脚本、1份数据表说明文档和1份复杂数据预处理实践指导手册docm格式覆盖从数据库建表、业务数据导入到数据质量处理与结果输出的完整实验链路。该资料已有1825人学习下载可作为大学课程设计结课作业的参考模板也可用于日常上机练习。指导手册通过具体业务案例逐步演示了Spoon中的去重、缺失值填充、日期格式统一、公式计算以及多表关联等典型操作SQL脚本提供可直接导入数据库的模拟业务数据数据表说明文档则帮助读者快速定位字段含义与表间关系降低准备成本。依照手册亲自动手做完这份预处理大作业后学习者既能掌握Kettle各常用组件的配合逻辑也能建立数据质量问题的排查与解决思路为后续数据分析和实际项目开发打下基础。1. 数据预处理作业KETTLE为什么我用SQL熬了一晚上它半小时跑完第一次看到「数据预处理作业(KETTLE)」这个标题我下意识想到两件事一是作业本身你要把一份脏数据整理成能入库、能分析的干净表二是Kettle里的Job对象它真正承担调度和编排的职责。这个双关恰好说清了Kettle的价值它不是那种只有大厂才用得上的企业级ETL平台而是个人电脑上处理Excel、CSV、半结构化文本最顺手的数据加工工具。我曾花一整晚用SQL清洗一份含合并单元格、日期文本、千分位金额、重复记录的销售明细后来换成Kettle拖拽步骤半小时跑完直接写库。这篇文章适合被Excel公式和临时SQL清洗折磨的人也适合需要把同一套清洗流程反复跑多次的重复场景。我会从下载部署、核心概念、真实预处理案例讲到排查避坑最后落在参数化和复用技巧上。2. Kettle下载安装与系统部署认准PDI一次配好环境很多人卡在第一步下载的Kettle装完界面起不来或者发现下载了个和预期完全不同的东西。这里先给结论你现在要下载的是Pentaho Data Integration的社区版发行包简称PDI日常说的Kettle就是它。它不需要安装解压就能用这一点比绝大多数数据处理工具都省心。2.1 先弄清Kettle、PDI和Pentaho的差别再动手Kettle是这个工具的老名字后来项目改名成Pentaho Data Integration但社区里叫Kettle叫习惯了所以你在网上搜「kettle下载」「kettle pdi下载」都能搜到同一个东西。下载时去看发行包文件名带pdi-ce字样的就是社区版免费可用。不要下载成商业版功能演示包也不要下载那些很多年前的老版本——老版本不仅界面老旧对新版JDK和Excel文件的兼容性都很差。另一个容易踩坑的点是JDK版本。PDI不同发行版对JDK版本要求不一样有的要求JDK 8有的要求JDK 11或更高。下载页面一般会标明要求装之前先用这条命令确认本机Java版本java -version如果命令提示找不到java说明JDK没装或者没配环境变量。Linux上常见做法是安装对应版本的OpenJDK然后设置JAVA_HOME。这里提醒一句不同版本PDI对JDK版本的要求确实存在差异而且升级JDK后旧版PDI可能直接闪退这类问题后面专门讲。2.2 本机安装与Spoon界面启动免安装包怎么做确认JDK就绪后把下载好的zip包解压到目录比如Windows上解压到D:\kettleLinux上解压到/opt/kettle。解压后能看到spoon.sh、pan.sh、kitchen.sh这几个核心脚本。spoon.sh负责启动图形界面pan.sh用来在命令行运行转换Transformationkitchen.sh用来在命令行运行作业Job。# Linux解压并启动图形界面本机要有桌面环境 unzip pdi-ce-*.zip -d /opt/kettle cd /opt/kettle ./spoon.sh启动时偶尔会看到内存不足的报错。Kettle是Java程序默认堆内存配得比较保守。打开spoon.sh能找到PENTAHO_DI_JAVA_OPTIONS这一行参数常见做法是把-Xmx调大例如改成-Xmx2048m再复杂一点的数据流就需要-Xmx4096m。调完后重启Spoon就能生效。图形界面启动慢是正常的第一次启动要初始化插件、加载步骤库等十几秒甚至半分钟都算正常别急着反复点开。2.3 Linux服务器部署用Pan和Kitchen跑批不碰图形界面真正的生产环境往往没有桌面部署的是Linux服务器。这时候就不需要启动Spoon了只需要保证pan.sh和kitchen.sh能运行。整个部署流程可以压缩成这几步# 上传并解压PDI发行包到服务器 mkdir -p /opt/kettle unzip pdi-ce-*.zip -d /opt/kettle cd /opt/kettle chmod x *.sh # 确认JAVA_HOME已配置 echo $JAVA_HOME # 如果为空需要先安装JDK并写入环境变量 # 验证pan能正常执行 ./pan.sh -version服务器上常见的进一步需求是提供远程执行入口Kettle里对应的组件叫Carte它本质是一个轻量级Web服务能接收远程请求并执行转换和作业。启动方式是在PDI目录下执行# 后台启动Carte监听8081端口 nohup ./carte.sh 0.0.0.0 8081 /opt/kettle/logs/carte.log 21 sleep 5 tail -50 /opt/kettle/logs/carte.log这段命令里0.0.0.0表示监听所有网卡8081是服务端口日志写到carte.log里。我要特别提醒Carte默认有一个用户cluster密码是cluster部署到服务器上之后第一件事就是改密码或限制访问来源否则相当于把数据处理入口暴露在公网。很多团队部署完不管密码这就是给自己埋雷。Carte只是远程执行通道作业调度通常还是交给kitchen.sh配crontab来完成Carte更适合需要跨机器协调或网页监控的场景。3. 分清转换与作业Kettle里最容易混淆的两个核心对象Kettle里有两个高频词Transformation转换和Job作业。很多新手混着用等真正做预处理作业时才意识到两者完全不同。转换是数据处理流水线作业是流程调度器。数据预处理任务往往是「一个转换 一个作业壳」的组合。3.1 转换和作业到底谁负责干什么转换解决「数据怎么变」读入、清理、拆分、合并、输出。它就像一条生产线数据从输入步骤流进去经过一个个处理步骤从输出步骤流出来。转换里的步骤之间用跳Hop连接跳的本质是数据行的传递通道。作业解决「流程怎么走」第一步做什么、第二步做什么、失败怎么办、是否定时执行。作业里装的是转换、SQL脚本、Shell命令、邮件通知这些组件按顺序或条件执行。作业本身不直接处理数据它只是调度者。我见过有人试图在作业里塞几十个输入输出步骤结果整个作业混乱到无法维护——正确做法是拆成多个小转换再用作业串起来。3.2 步骤、跳与数据流预处理的核心就是管好字段Kettle里没有「表」的概念数据以行Row和字段Field的形式在步骤之间流动。每个步骤接收输入行经过处理产生输出行。理解这一点对排查问题很重要某个步骤的结果不对根源往往是上游字段元数据已经错了。字段在这条数据流里携带类型信息字符串、整数、日期、布尔值。类型不匹配是最常见的翻车点。例如Excel里的一列明明是日期读出来却是文本或者金额字段带着千分位逗号直接被当成文本。所以预处理作业的核心工作对象不是行而是字段。你要确保每个字段进入下一步时类型正确、值合法、名称清晰。3.3 用文件方式还是资源库为什么我建议用文件Kettle支持两种保存方式资源库Repository和文件方式。资源库把转换和作业存在数据库里适合多人团队协作有版本权限管理文件方式则是保存成.ktr转换和.kjb作业后缀的XML文件。我强烈建议个人项目和多数团队用文件方式原因很直接.ktr文件是纯文本可以放进Git做版本管理改了什么一眼就能对比出来出问题可以被文本编辑器打开检查复制到别的环境直接跑不依赖资源库连接配置。资源库虽然看起来正式但一旦数据库连不上整个项目都动弹不得。文件方式配合Git才是「可复现、可回溯」的预处理作业。4. 完整案例从脏Excel到干净数据库表的具体操作下面用一个我处理过的模拟场景来讲完整落地步骤。任务背景是某公司的运营日报数据预处理拿到一份门店销售明细Excel里面有合并单元格、空行、日期是文本、金额带千分位、存在重复记录需要拆分省市字段最后写入数据库。这就是典型的「数据预处理作业」要干的事。4.1 先做数据体检确定输入输出模型再动手拿到数据第一步不是打开Kettle而是先看数据。用文本编辑器或Excel打开原始文件确认这几件事文件编码、分隔符、表头在哪一行、哪些列是脏的、多大规模。比如Excel另存为CSV时经常是GBK编码而Kettle默认按UTF-8读读出来全乱码这就是编码没确认的后果。如果处理的是npp夜间灯光数据这类栅格产品的预处理思路也类似通常在GIS软件里先完成栅格转矢量、按行政区统计再把结果导出成CSV或Excel接下来到Kettle里做编码字段检查、行政区代码关联、空值和异常值过滤。Kettle不擅长空间计算但非常擅长把空间计算输出的结果表做规整、关联和入库。所以数据体检阶段就要定好输入文件和输出表结构。定方案时先画一个步骤清单文件输入 → 字段拆分 → 去除重复记录 → 字段选择与类型转换 → 插入更新。这个清单就是转换的主干后面在Kettle里就是按这个清单拖步骤。4.2 拖出核心步骤文件输入、拆分、去重、字段整理在Spoon里新建一个转换从左侧面板搜索并拖出以下步骤按顺序连接。首先是「文本文件输入」CSV文件输入。配置时重点看三个地方文件路径、编码、分隔符。编码选错就是一片乱码。如果有合并单元格的问题正确做法是先在Excel或脚本里把合并单元格填充成实际值再导入KettleKettle本身不处理Excel合并单元格。然后是「字段拆分」。我常用它把「省-市」这种单字段拆成两个字段。Kettle里有拆分字段步骤设置哪个字段要拆、用什么分隔符、输出几个新字段。原始字段可以保留也可以丢弃看业务需要。要注意拆分后的字段如果包含空格要顺手用「字符串操作」去空格否则后续按城市分组时会莫名其妙多出好几个城市。接着是「去除重复记录」。这个步骤需要指定一个或多个比较字段Kettle会保留每一组重复值中的第一行或最后一行。配置时注意这个步骤是「流式比较」它要求输入数据按比较字段排序如果没排序结果可能不符合预期。这一点极其容易踩坑后面单独讲。最后是「字段选择」和「类型转换」。这一步就是把保留的字段重命名、调整顺序、设置正确的类型。日期字段如果是文本要在这里指定格式比如yyyy-MM-dd数字字段要设置长度为18、小数位数为2。很多入库报错都来自字段类型与目标表不一致。4.3 用pan.sh在Linux命令行静默执行转换在图形界面里调试好转换后保存成preprocess.ktr。生产环境不可能打开Spoon跑这时用pan.sh# 在Linux服务器上静默执行转换 /opt/kettle/pan.sh \ -file:/opt/kettle/jobs/preprocess.ktr \ -param:DATE2024-06-01 \ -level:Basic \ -logfile:/opt/kettle/logs/preprocess.log这条命令的参数含义-file指定转换文件路径必须指向.ktr文件。-param传递命名参数转换内部用${DATE}引用。后面讲参数化时会扩展。-level日志级别Basic表示只输出步骤级别的摘要信息适合日常跑批排错时改成Debug或Rowlevel能看每一行的数据变化但日志量巨大。-logfile把日志写入文件否则默认打到控制台。跑批任务一定要指定日志文件否则出问题查不到记录。用pan.sh执行的好处是不依赖图形界面能挂crontab定时跑日志可收集。执行完看一下退出码非0就是失败了。很多新手跑完不检查退出码以为没有报错就成功了结果数据一条没进去。4.4 入库环节插入更新与批量提交参数数据清洗完最终要写入目标表。Kettle写数据库的方式有多种「插入更新」是最常用的一个。配置它时需要指定数据库连接、目标表、用于匹配的字段相当于WHERE条件、需要更新的字段。它的逻辑是根据匹配字段查目标表存在就更新不存在就插入。这个步骤有几个参数值得调批量提交大小Commit size默认是500数据量大时可以调到2000这个值决定每攒多少条提交一次事务太大可能让内存压力上升太小则写库很慢。另一个是「跳过查询结果」之类的选项如果目标表数据量巨大、每次查询匹配都很慢需要考虑先建索引。写库之前还要检查目标表的字段类型和转换输出字段是否兼容。VARCHAR长度不够、DATE类型格式对不上、数值字段遇到空字符串都是高频报错点。我的经验是在写库步骤前加一个「空值替换」把空串统一替换成NULL或默认值能省去一半的入库报错。5. Kettle常见问题与排查5个让我加班到深夜的坑这部分写的是我真实遇到过的坑每一种都让我加过班。每一条按现象、原因、解决来梳理。5.1 图形界面闪退双击spoon.sh没反应现象在Windows或Linux上启动Spoon窗口一闪而过或者干脆没反应控制台也没输出。新手第一反应是下载的包坏了重新解压一遍还是同样结果。原因九成是JDK版本与PDI发行版不匹配。比如PDI新版本要求JDK 17机器装的是JDK 8Java程序直接启动失败但错误信息被Spoon启动脚本吞掉了。另外PENTAHO_DI_JAVA_OPTIONS里如果写了过大的-Xmx而机器内存不足也会闪退。解决先跑java -version确认版本再打开spoon.sh查看顶部注释里对JDK的要求。用命令行./spoon.sh直接启动错误会显示在终端里。如果显示UnsupportedClassVersionError就是JDK版本过低安装对应版本后重试。Spoon闪退排查别乱猜看终端输出比什么都快。5.2 中文乱码从CSV读出来全乱码现象文本文件输入步骤读CSV字段值显示成「銆愪笢鑺?」之类的乱码或者写入数据库后中文全变问号。原因CSV文件编码和Kettle读取编码不一致。国内很多Excel另存的CSV是GBK编码而Kettle默认UTF-8。源文件编码对了写入时目标数据库连接也可能默认字符集不对双重问题叠加。解决在文本文件输入步骤的内容页把编码从UTF-8改成GBK或改成自动检测。如果文件在Windows上生成优先试GBK。写库乱码则检查数据库连接的高级选项里是否声明了字符集数据库连接串上加上useUnicodetruecharacterEncodingUTF-8这类参数。乱码问题在预处理作业里极其常见定位方式就是先在Kettle的预览里看读进来是否正常再看写出去是否正常分段隔离开。5.3 去除重复记录的结果和预期严重不符现象一百条数据里明显有二十条重复用去除重复记录步骤后结果只剩一半甚至把不重复的数据也删了。原因去除重复记录步骤要求输入数据严格按照比较字段排序它是在数据流里「前后比较」的如果相同值的行没挨在一起它根本识别不出来。更隐蔽的是排序还用错了字段类型或大小写规则导致它认为两条值不同的记录是重复的。解决在去除重复记录之前加一个「排序记录」步骤按同样字段排序再看结果。另一个稳妥方案是用「分组」步骤配合聚合操作或者用「唯一行」步骤。记住一个原则Kettle里的去重不是数据库的DISTINCT顺序敏感排序做不对去重就是玄学。我后来养成的习惯是凡做去重先排序预览校验行数再往下走。5.4 Excel文件读不出来或读取为空现象用「Excel输入」步骤读取.xlsx文件报错或读出来行数为0。换成.xls却正常或者反过来。原因.xlsx和.xls底层格式不同Kettle对应的Excel读取插件依赖的POI库版本对新版Excel兼容不够好。同一份文件有的人能读有的人不能读常常是PDI版本差异导致。解决我一般不建议直接读Excel除非文件很小。常见做法是先把Excel另存为CSV或者用一个小脚本把多sheet拆成多个CSV再用文本文件输入读取。这样不仅绕开兼容性问题跑批性能也更好。如果必须直接读Excel优先检查PDI版本并确认插件已安装。血泪经验别为「直接读Excel」这个便利和兼容性问题死磕省不了一分钟坑起来一小时。5.5 数据量大时内存溢出或跑批越来越慢现象几万行数据没问题跑到几十万行就卡死日志报OutOfMemoryError或者跑批时间随数据量指数上涨。原因Kettle默认堆内存只有几百MB大步骤如排序、去重、分组都需要把数据暂存在内存里另外有些步骤配置了缓存行数默认值过大会放大内存压力。解决调PENTAHO_DI_JAVA_OPTIONS的-Xmx一般数据量在百万行级别给-Xmx4096m比较稳妥。同时到具体步骤里检查缓存参数比如「排序记录」里有一个缓存大小限制改成合理的行数而不是默认值。如果调完还是慢用日志级别Debug看数据流卡在哪个步骤优先优化那个步骤。运行前先在预览里用前一万行数据跑通再放开全量这是成本最低的验证方式。6. 让预处理作业可复用参数化、日志级别与全量前的验证技巧到了这一步你的预处理转换已经能跑通接下来要解决的是「能不能重复用、能不能给别人用、出问题能不能快速定位」。首先做参数化。把文件路径、日期、目标表名这些会变化的值都改成变量引用。在转换里用${VAR_NAME}占位运行时通过-param:VAR_NAMEvalue传入或者在作业里用「设置变量」步骤定义。这样同一个转换每天换日期就能跑日批不用每天改文件。我见过有人把日期写死在步骤里每周手工改一遍这不是预处理作业这是手工活。日志级别也要养成固定习惯。日常跑批用Basic看每个步骤读多少行、写多少行就够了出了问题用Detailed看每个步骤的耗时再查不到就用Rowlevel这是数据行级别的日志能看到每条数据经过每个步骤的前后变化。Rowlevel日志量很大只适合小数据排查不能直接拿全量跑。善用日志是排查所有Kettle问题的基础这条捷径值得早点走。全量跑批前一定先小数据验证。我自己的习惯是复制转换把输入文件替换成前一千行数据跑完看插入更新步骤的行数、看目标表里的值确认无误再用完整数据执行。这一步能拦住绝大多数脏数据引发的写库事故。另一个技巧是把预处理结果先输出到一个预览CSV肉眼检查几个关键字段再决定要不要正式入库相当于给自己留一个后悔药。我自己最深的教训是一开始拿到任务就急着在Kettle里堆步骤结果每一步没问题合起来结果不对排查了一整天才发现是字段名在中间步骤被改了大小写。现在无论任务多急我都会先在纸上画一遍「输入字段 → 各个步骤后的字段 → 输出字段」的清单确认每个字段在每个步骤里的名字和类型都没变再动手搭转换。这个习惯帮我避开了大多数翻车。数据处理这行慢就是快先把每一步看明白再跑比反复重跑省时得多。希望帮到你。本文还有配套的精品资源点击获取