Kettle(PDI)入门实战:从环境搭建到CSV转Excel

发布时间:2026/10/19 9:14:29
Kettle(PDI)入门实战:从环境搭建到CSV转Excel 在数据开发这条路上摸爬滚打几年的人基本都绕不过一个词ETL。我第一次用Kettle现在更多人叫它PDI也就是Pentaho Data Integration时是给某家电商公司做订单数据的日结汇总。当时团队里有人用脚本处理有人用商业ETL工具而我手里只有一个装好的Kettle社区版没想到这一用就是好几年。很多刚接触这个工具的朋友第一反应是“界面太老了”“步骤这么多看不懂”但只要你理解它的几个核心概念Kettle完成数据抽取、清洗、装载这类活真的比想象中顺手很多。这篇教程是系列第一篇我打算把Kettle从“听说过”到“能跑通一个完整转换”的过程讲透。你没接触过ETL也没关系CSV文件你肯定见过Excel你也肯定用过我们今天就从“读一个CSV文件再写成一个Excel文件”这个最小例子入手把环境准备、核心概念、实操配置和常见坑全部过一遍。适合场景是刚入行的数据开发、经常需要手工导数的业务分析师、以及想给团队搭一套轻量数据流程的研发同学。1. 为什么是Kettle/PDI先把工具选型这事想明白1.1 ETL到底在干什么ETL三个字母分别对应Extract抽取、Transform转换、Load装载。说人话就是从A地拿数据在中间把乱七八糟的数据洗干净、变成目标格式再送进B地。常见的真实场景包括从业务库MySQL里把订单表导出来过滤掉测试订单把时间字段统一成标准格式然后加载到数据仓库或者每天凌晨把昨天新增的用户数据从Excel文件里读出来合并到CRM系统的数据库表中再比如把第三方接口返回的JSON日志解析成结构化表供报表使用。以前很多人用脚本做这件事Shell、Python、SQL存储过程都行。但脚本有一个问题每个项目都要重新写连接、写异常处理、写日志、写重跑机制改一个字段就要改代码出了问题排查全靠打印日志。而Kettle把ETL流程拆成了一个个可视化步骤连线成图输入输出和字段处理都拖到画布上完成数据流更直观还能直接预览每一步的中间结果。理解这一点很重要后续所有操作你都会发现Kettle其实是在帮助我们“把数据处理流程变成一张图”。1.2 Kettle和其他方案怎么选我见过不少团队在做ETL选型时纠结这里给一个相对客观的对比。需要说明的是这几个方向并不是完全替代关系而是看你的团队规模、数据体量和维护能力。方案优势劣势适合场景自研脚本Python/Shell灵活度最高能处理复杂逻辑开发量大监控、调度、断点续跑都要自己造一次性的临时任务、大规模分布式清洗Kettle/PDI图形化、免费、跨平台、步骤插件丰富界面老超大流和复杂血缘图会卡中小体量数据、需要快速交付的日常ETL商业ETL工具如传统企业级的套装支持好、调度监控完善贵学习曲线陡授权复杂大型企业规范化数据平台云上数据集成服务免运维、与云生态结合好数据源和网络受限于云环境迁移成本不低云原生产品或要求全托管运维的团队我个人选Kettle的原因非常简单免费、开源、不用写代码也能跑通大部分转换跨平台Windows、Linux都能装数据库支持面广主流的MySQL、Oracle、SQL Server、PostgreSQL都有驱动社区资料多踩坑基本都能搜到。但也要提醒一句如果你的数据量已经到了每天几亿行并且对性能极其敏感Kettle不是最优解它更适合“人肉可维护、规则中等复杂、数据量在千万级到亿级以内”的流程。选型这件事没有最好只有匹配。2. 环境准备下载、启动和第一眼认识界面2.1 版本和JDK的搭配很多人卡在Kettle启动这一步根子上的原因往往是JDK版本不匹配。Kettle是用Java写的所以必须先装好Java运行环境。选版本时别盲目装最新版要看Kettle发行包的兼容要求。Kettle版本建议JDK版本备注7.xJDK 7或8太老不建议新项目用8.2 / 8.3JDK 8我推荐多数人用8.3稳定9.xJDK 8或11新版功能多但遇到需要改源码的坑更麻烦装JDK比较简单去官网下载对应操作系统的安装包Windows直接解压配置环境变量Linux用包管理器安装也行。关键点在于配置JAVA_HOME和PATH。Windows下通常要去“系统属性 - 环境变量”里新增JAVA_HOME指向JDK目录再把%JAVA_HOME%\bin加到PATH里然后在命令行输入java -version验证。Linux下可以在/etc/profile或用户~/.bashrc中写入export JAVA_HOME和export PATH。一个小提醒别让Kettle 8.3去跑JDK 11我在实际环境里试过部分插件加载会报错尤其是老的数据库驱动。用Kettle 8.3就老老实实配JDK 8能省很多莫名其妙的问题。2.2 下载、解压与目录结构去Kettle社区官网下载data-integration包Windows对应zipLinux对应tar.gz。解压后会看到一个目录常见的叫data-integration里面就是全部程序。重点是这几个子目录和文件目录/文件作用Spoon.bat / Spoon.sh图形化客户端启动脚本Kitchen.bat / Kitchen.sh命令行执行作业Job的脚本Pan.bat / Pan.sh命令行执行转换Transformation的脚本lib/核心jar包和数据库驱动目录plugins/第三方插件目录simple-jndi/JNDI数据源配置目录我建议你在桌面上建一个专用目录把Kettle的解压包放进去不要放在带中文或空格的路径下。虽然Kettle对路径不算特别敏感但有些老版本插件解析路径时遇到中文目录会出奇怪问题。解压后先不要急着双击启动检查一下JAVA_HOME是否生效再进入目录执行Spoon启动脚本。Windows用户直接双击Spoon.batLinux或Mac用户在终端执行./spoon.sh。首次启动会初始化资源库和默认配置文件界面加载会比较慢几秒到十几秒都正常。如果界面没弹出来先去看启动控制台有没有报错九成是JDK版本或内存配置问题。2.3 调整内存参数Kettle默认启动内存可能只有几百MB一旦处理几十万行数据卡死、内存溢出是家常便饭。所以拿到安装包后第一步是先改启动脚本里的内存参数。Windows编辑Spoon.batLinux/Mac编辑spoon.sh找到类似这样的一行PENTAHO_DI_JAVA_OPTIONS-Xmx1024m -XX:MaxPermSize256m把它改成至少如下配置PENTAHO_DI_JAVA_OPTIONS-Xmx4096m -Xms512m -XX:MaxPermSize512m参数说明-Xmx是最大堆内存-Xms是初始堆内存-XX:MaxPermSize是老版本JDK的永久代大小。如果你的机器内存有16G以上给Kettle分4G到6G比较合理。我在实际项目里处理几百万行数据时用4G是够的几千行到几十万行默认配置也能跑但大量使用“排序记录”或者“内存中合并”这类步骤时内存越大越安心。改完脚本后重启Spoon。如果还是在加载大数据时报OutOfMemoryError不要盲目继续加内存先检查你的流程是不是用了某些会把数据全部加载到内存的步骤比如“数据库查询”里的某些缓存模式。2.4 主界面布局快速认识第一次打开Spoon你会看到一个大致的开发环境左侧是“视图”树和“核心对象”树中间是画布区域下方是日志和执行结果面板。刚开始不需要把所有功能都搞清楚重点记住三个区域即可。左侧的“核心对象”是步骤列表按“输入”“输出”“转换”“查询”“连接”等分类排列所有数据处理逻辑都从这里面拖到画布上。“视图”树里主要显示资源库、转换和作业后续会用到。中间的大片空白是画布转换或作业的步骤就放这里步骤之间用连线表示数据流或执行流。下方日志面板非常重要设置错误、SQL报错、数据行数统计都会在这里显示排查问题时先看这里的红色报错信息。还有一个容易被忽略的地方是右上角的“设置”图标点开后可以配置全局参数、变量、连接等。新手可以暂时不管但我强烈建议你记住它的位置系列后面几篇我们会在参数化配置里反复用到。3. 核心概念不搞懂后面全是坑3.1 转换和作业两兄弟各干各的活Kettle区分两个核心对象转换Transformation和作业Job。理解这两者的区别是做Kettle开发的第一个分水岭。转换处理“数据流”强调的是数据在步骤之间流动。比如从CSV读取数据经过字段过滤再写到Excel这个流程本身就是一条数据流是转换。在转换里步骤之间用“主线”连接数据是一行一行流过去的类似于流水线原料从第一台机器进去经过清洗、切割、包装最后从最后一台机器出来。作业处理“执行流”强调的是编排和调度。比如“先执行转换A如果成功了再执行转换B如果失败了发一封邮件告警”这是作业。作业里的步骤之间用“跳”来连接每条跳有成功、失败、无条件三种类型。作业本身不对行数据进行处理它只是一个“车间主任”负责指挥各个转换按什么顺序跑、跑失败后怎么办。怎么记数据行的搬运和改造就选转换流程的调度和判断就选作业。很多新手把作业和转换混着用在一个作业里塞十几层转换连线最后执行顺序乱掉其实就是没分清这两者。3.2 步骤、连线与数据流机制在转换画布里一个“步骤”是最小的处理单元。步骤被分类为输入、输出、转换、查询等比如“CSV文件输入”是输入步骤“Microsoft Excel 输出”是输出步骤“过滤记录”是转换步骤。步骤之间用“连线”连接线上会标注数据流的字段名和数据类型。你从输入步骤出发按住步骤边缘出现的箭头拖到下一个步骤就建立了一条连线。连线本质上是上下游步骤之间的数据通道上游步骤每输出一行下游步骤就处理一行。数据流中的每一行称为“数据行”每个行由若干个“字段”组成。字段的概念和数据库表的列一样也有名字和类型。Kettle的核心字段类型包括String、Integer、Number、Date、Boolean、BigNumber等。这里特别提醒CSV文件输入时Kettle默认会把很多字段识别成String即使里面全是数字。所以你在后续步骤中做计算时需要在“字段选择”或输入步骤里显式转换字段类型。理解“数据流”还有一个好处很多性能问题都是因为一个步骤处理太慢拖住了整条链。在Kettle里上游步骤不会等下游完全跑完才继续而是以“批次缓冲”的方式推送数据所以你可以观察每一行的流式行为定位哪个步骤卡住了。3.3 变量与命名方式Kettle支持变量引用格式是${变量名}。你可以定义全局变量在作业中设置变量也可以在转换参数里接收外部传入的值。这个特性在区分开发环境和生产环境时非常有用。假设你的CSV路径在开发机是D:/data/input/xxx.csv在生产机是/data/input/xxx.csv如果直接写死路径切换环境就要手动改转换。更好的做法是在转换属性中定义一个“命名参数”比如input_file然后在CSV文件输入路径里写${input_file}。运行时通过命令行或作业传入实际路径同一个转换就能在不同环境复用。使用变量时要注意作用域。Kettle的变量优先级从高到低大致是命令行参数、作业内设置的变量、全局配置文件中的变量、系统环境变量。排查“变量没生效”时先看你在哪个作用域定义的再看拼写是否一致变量名大小写也容易踩坑。3.4 资源库与文件保存方式Kettle的转换保存为.ktr文件作业保存为.kjb文件。刚接触时直接用文件保存是最简单的新建一个目录把每次开发的转换文件放进去配合版本控制系统管理历史版本我推荐这种做法。除了文件保存Kettle还支持“资源库”方式。资源库把转换、作业、连接配置都存在同一处可以是数据库资源库也可以是文件资源库。数据库资源库适合团队多人协作因为它可以统一管理对象和权限文件资源库则本质上是把资源库元数据以文件形式保存。我的建议是单个人学习或小团队开发直接用.ktr文件和版本控制就够了别一开始就用数据库资源库容易出现数据库锁冲突、资源库表结构问题。等团队大了再考虑统一资源库也不迟。这一点是经验之谈我在项目里见过太多因为资源库配置混乱导致团队协作卡壳的情况。4. 撸一个最简单但完整的转换CSV到Excel4.1 准备一份测试数据做任何ETL实操前先准备测试数据。打开一个文本编辑器把下面内容保存为demo.csv注意编码选择UTF-8避免后面中文乱码。订单编号,订单日期,订单金额,订单状态 DD2024001,2024-01-05,128.50,已完成 DD2024002,2024-01-06,66.00,待发货 DD2024003,2024-01-07,89.90,已完成 DD2024004,2024-01-08,233.10,已取消这份数据很简单但包含字符串、日期和数字三种常见类型。字段之间是英文逗号第一行是表头。如果你想让数据更接近真实场景可以再加一列“客户备注”里面写中文内容。但注意CSV规范如果字段内容中包含英文逗号或换行需要用双引号包裹整个字段否则Kettle解析时会分列错乱。4.2 新建转换并配置CSV文件输入打开Spoon后菜单选择“文件 - 新建 - 转换”或者按快捷键CtrlN画布就是空的。左侧“核心对象”里展开“输入”找到“CSV文件输入”步骤拖到画布上。双击该步骤打开配置窗口需要设置的关键项有四个。第一是“文件名”点击浏览选择你的demo.csv路径第二是“是否包含头部行”默认是“是”我们这份数据带表头所以保持即可第三是“分隔符”默认是英文逗号如果你的CSV是分号或制表符这里要改第四是“编码”强烈建议手工指定UTF-8不要使用“系统默认”因为Windows系统默认可能是GBK。设置完基础项后点击“获取字段”按钮Kettle会读取文件头部自动把字段列表带出来。此时要检查每个字段的类型和格式。正确类型应该是订单编号为String订单日期为Date且格式为yyyy-MM-dd订单金额为Number订单状态为String。如果Kettle把日期识别成了String就在字段列表中把类型改为Date格式写yyyy-MM-dd。这一步很关键因为后面做日期筛选或排序时类型不对会直接报错。配置完成后点击“预览”按钮Kettle会读取前若干行并在弹窗中展示你能直观看到字段名和数据值确认无误后再回到画布。4.3 添加Excel输出并连接步骤再回到“核心对象”的“输出”分类找到“Microsoft Excel 输出”步骤拖到画布上放在CSV文件输入步骤的下方。鼠标移到CSV输入步骤的边缘会出现一个带箭头的连接点按住拖到Excel输出步骤松开后一条连线就建立好了这条线代表数据流方向。双击“Microsoft Excel 输出”步骤配置文件名和路径比如output.xlsx。在“工作表名称”里写一个名字比如“订单数据”实际会生成一个以此命名的工作表。还要注意“写入方式”选项一般有“新建文件”和“追加或覆盖”第一次跑选择“新建文件”即可如果文件已存在需要覆盖要有意识地配置“创建或覆盖”选项避免手动删文件。最关键的是“字段”页签。点击“获取字段”按钮Kettle会从上游步骤读取字段列表自动填充到输出字段中。你可以调整字段顺序也可以在这里修改Excel列名。如果你只想输出部分字段就手动删除不需要的行。配置完成后转换画布上会出现一条从CSV到Excel的连线两个步骤连成一个完整流程。4.4 运行转换并核对结果点击工具栏上的“启动”按钮绿色三角Kettle会从头执行整个转换。执行过程中下方日志面板会打印每一步的处理行数比如“CSV文件输入.0 - 读取了4行”“Microsoft Excel 输出.0 - 写入了4行”。运行完成后到文件目录找到output.xlsx用Excel打开检查。你可能会看到两个现象需要留意一是日期列可能显示成序列号或文本这说明CSV输入步骤里的日期格式没有配置好二是中文可能乱码这通常和编码设置有关。解决方法是回到CSV文件输入步骤把编码固定为UTF-8并确保日期格式为yyyy-MM-dd。这里我建议你养成一个习惯每次跑完转换都去对照源数据和目标数据的行数。Kettle日志里显示了两个数字4进4出那就说明流程没有丢数据。如果输入4行输出只有3行说明中间有步骤过滤掉了某些行或者转换步骤发生错误被跳过这时候要回到对应步骤看日志和配置。4.5 让这个转换更贴近真实需求CSV到Excel只是热身真实项目里还会有清洗、过滤、合并、排序等需求。你可以试着在CSV输入和Excel输出之间再加几个步骤这几个步骤也是我常用的拖入一个“字段选择”步骤放在CSV输入之后。在配置窗口里可以删除不想要的字段比如去掉“客户备注”列把订单金额的类型改成Number还可以给字段改别名比如把订单金额改成amount。字段选择是Kettle里最常用的字段管理步骤几乎所有转换里都有它的身影。再拖入一个“过滤记录”步骤配置条件是订单状态等于已完成这样只有已完成的订单才会往下游输出。过滤记录步骤有两个输出分支包含数据的行走“真”分支不符合条件的行走“假”分支。我第一次用的时候常常忘记把“假”分支连接到一个空操作步骤导致过滤出来的脏数据无处可去Kettle会警告你某些分支没有连接。如果要按订单日期排序可以加一个“排序记录”步骤在配置里选择排序字段和升降序然后把它连接在过滤之后。排序记录会缓存所有数据到内存大数据时要留意内存是否够用。做完这些改进后你的转换就从“复制粘贴”升级成了“带清洗逻辑的数据管道”。5. 踩坑记录这些问题我基本都遇到过5.1 中文乱码和字符集问题Kettle最容易被新手骂的就是乱码。现象是CSV里的中文在Kettle预览时正常但写到Excel后变成“”或者“锟斤拷”或者从数据库导出的中文字段乱码。问题八成出在输入和输出的字符集不统一。CSV文件本身是UTF-8编码但Kettle的CSV输入步骤默认可能是系统编码Windows下就是GBK两者不一致就乱码。解决方案很简单在所有输入、输出和数据库连接环节都显式指定UTF-8。数据库连接配置里往往也有“字符集”选项比如MySQL连接parameters上加characterEncodingutf8。还有一个坑Excel打开CSV文件乱码和Kettle无关。很多编辑器不写UTF-8 BOM头Excel默认按ANSI解析所以你在Kettle里生成的UTF-8无BOM文件用Excel打开会乱码。如果你最终交付给用户的是CSV且对方用Excel看可以在输出步骤的编码选项里选择UTF-8带BOM或者干脆输出成真正的.xlsx格式。5.2 内存和性能问题跑大转换时最常遇到两个错误Java heap space和OutOfMemoryError。前面提过先调大启动脚本的-Xmx参数。但调大内存后仍报错就要检查流程写法了。我见过一个案例某开发者处理两百万行数据用“数据库查询”步骤循环查一张大表结果越跑越慢最后内存爆掉。原因是每个查询步骤都可能缓存结果集尤其在循环里反复查询时内存成倍增长。优化方向一般是使用SQL连接代替逐行查询合理使用“排序记录”前增加局部过滤把大任务拆成多个小转换分片执行。数据库写出的“提交批次大小”也很关键。表输出步骤里有“每个批次的行数”参数默认可能几百行。如果你写出到数据库每行提交一次事务速度会慢到怀疑人生。我会把批次调整到5000或10000同时配合数据库连接的批量提交设置写入性能提升非常明显。5.3 数据库连接不上Kettle连接数据库报错常见原因有四类。第一驱动jar没有放到lib目录下。比如连接MySQL要把mysql-connector-java-xxx.jar放到data-integration/lib下然后重启Spoon。第二JDBC URL写错。MySQL一般要写成jdbc:mysql://主机IP:端口/数据库名?参数Oracle、PostgreSQL也各有固定格式复制粘贴时注意空格。第三防火墙或网络不通用命令行先ping一下目标机器。第四SSL参数问题新版MySQL连接可能要求指定useSSLfalse。连接配置有一个小细节容易忽略Kettle的“数据库连接”配置在转换的“视图”树里不是放在某个转换步骤里。表输出、表输入、数据库查询这些步骤本身不保存连接它们只是引用这个连接。所以你要是换了环境只需要修改连接配置所有步骤都会跟着改。5.4 找不到驱动或jar包冲突如果你在lib目录里放了多个版本的MySQL驱动Kettle可能加载到旧版本然后报奇怪的语法错误或字符集错误。建议lib目录里每个数据库只保留一个兼容的驱动jar。如果不确定兼容版本选择官方较新的稳定版即可。另外Kettle本身自带了部分数据库驱动比如SQLite、H2等你直接补充缺失的驱动就好不用全部清空。遇到ClassNotFoundException先确认jar包是否真的在lib下再确认jar包是否损坏办法是用解压工具打开jar看里面的class文件结构是否完整。5.5 预览数据正确运行结果却不一致Kettle步骤上右键菜单里有一个“预览”功能会模拟运行该步骤以查看它前面输出的数据。新手常遇到的问题是预览CSV输入时数据正常但运行整个转换后Excel里数据不对或为空。原因是预览模式不会执行该步骤下游的写操作更不会触发“表输出”“文件输出”这类步骤。预览给你看的只是当前步骤的输出结果并不能代表整个转换已经正确执行完毕。判断整个转换是否成功要点击“启动”运行完整流程然后看日志面板里的“步骤度量”统计比如某步骤读取/写入了多少行有没有报错。这条经验能帮你少走很多弯路。5.6 修改了转换配置却不生效有时候你改了CSV输入的文件路径但运行时好像还在读老文件。遇到这类问题先看看你是不是把资源库缓存开着了。如果用了数据库资源库Kettle可能缓存了对象的元数据。最简单的办法是重启Spoon或者右键点击转换选择刷新。另一个常见原因是你改的是某个步骤的副本而不是画布上的那个步骤。Kettle里同一个步骤对象可以被复制如果你拖了两个“CSV文件输入”步骤并且只修改了其中一个运行时会发现走的是另一个。排查方法双击要运行的转换根节点确认逻辑分支连接的是哪个步骤再看步骤名称是否重复。养成给步骤命名的习惯比如“读取订单CSV”“输出订单Excel”比默认的“CSV文件输入”好排查得多。写在后面这套工具值得继续玩下去做数据开发这几年我用Kettle跑过电商订单同步、银行客户数据清洗、报表每日刷新、甚至小团队的数据迁移整体感受是它不像写代码那样拥有无限自由但正因为有边界反而让你更容易把思路收敛成一条清晰的处理流程。第一篇先讲到这里你已经拥有了完整的Kettle环境、理解了转换和作业的区别并且独立跑通了第一个CSV到Excel的转换。这个最小闭环看起来简单其实已经覆盖了“读、转换、写”的完整ETL闭环。接下来的系列内容我会继续拆解作业调度的玩法、数据库之间的数据同步、变量与参数化设计、以及中文乱码的彻底根治方案。如果你在照着操作的过程中踩了和上面不同的坑欢迎把你遇到的问题记录下来对着一张转换图排查通常都比对着几百行脚本找错要轻松得多。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询