尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Kettle转换怎么用?从步骤、跳、字段映射到ETL实战

Kettle转换怎么用?从步骤、跳、字段映射到ETL实战 最近好几个刚转数据岗位的同事跑来问我Kettle里的“转换”到底怎么用他们卡在同一个地方——能打开软件也能新建文件但一看到“转换”和“作业”两个词就懵更不知道从哪下手。我打算把Kettle转换的使用从头捋一遍不绕弯子从概念讲到实操再讲几个我自己踩出来的坑。目标是让你看完后能自己搭出一个像样的转换处理Excel、CSV、关系数据库之间的数据移动和清洗至少不会被“步骤”“跳”“字段映射”这些词吓住。1. Kettle转换到底是什么1.1 转换和作业别再混了很多新手犯的第一个错误是把所有东西都放在同一个“流程”里跑。Kettle其实把数据处理分成两种文件转换.ktr和作业.kjb。转换解决的是“怎么把数据从A搬到B中间洗一洗”的问题里面是步骤和跳作业解决的是“什么时候跑、跑完这个跑哪个、失败怎么办”的问题里面是工作条目和调度逻辑。这么说吧转换是工人作业是工头。工人负责干活工头负责安排顺序和节奏。你在转换里不会看到“如果失败了就发邮件”这种逻辑那是作业的活。反过来说作业里也不能直接做字段拼接、值映射这些数据处理它只能调用转换或者执行SQL脚本、文件操作、发邮件。常有人问“那我只用转换不用作业行不行”如果数据量小、只跑一次直接运行转换当然没问题。但只要涉及定时同步、多步骤联动、失败重试就必须在作业里把转换串起来。理解了这层关系后面学起来就顺了。维度转换作业文件类型.ktr.kjb核心成员步骤、跳作业项、调度依赖主要用途数据抽取、清洗、加载调度、流程控制、失败处理执行方式并行流水线串行或条件执行1.2 转换的组成步骤、跳、字段一个转换的核心就三个概念步骤Step干活的节点比如“Excel输入”“表输出”“字段选择”“排序记录”。跳Hop步骤之间连起来的箭头表示数据从一个步骤流到下一个步骤。行集缓冲区跳背后实际的数据通道步骤A处理完的行先放进缓冲区步骤B再从缓冲区取两边速度不一致时靠它缓冲。Kettle的转换是并行执行的这点和很多人脑里的“一行一行顺序跑”不一样。你在画布上放了三个步骤它们会同时启动数据像流水一样流过。这也是Kettle能处理一定量级数据的原因。字段是另一个容易被忽略的关键。每个步骤都有输入字段和输出字段的元数据定义。比如“Excel输入”会读取列名“字段选择”会决定这些列去留和顺序。数据在这些步骤之间流动时字段名和类型必须能对得上否则会报错。绝大多数新手问题都出在“我以为这个字段有其实没有”“我以为它是数字其实它是字符串”上。1.3 为什么转换是ETL的核心ETL三个字母Extract抽取、Transform转换、Load加载。Kettle里的转换可以同时干这三件事从各种数据源读取是抽取中间加步骤清洗、拼接、计算是转换写到目标表是加载。所以一个转换可以是一个完整的ETL作业单位。但实际项目里我习惯把抽取、清洗、加载拆成多个转换组合。比如一个转换负责从多张业务表查出当月数据另一个转换负责把结果写进数仓分层表。好处是每个转换职责单一出问题时日志好定位数据量变化时也便于单独调优。这属于经验之谈并不是Kettle强制要求但这么用下来排错成本低很多。2. 转换开发前的准备工作2.1 下载安装与版本选择Kettle现在叫Pentaho Data IntegrationPDI你搜“Kettle下载”会看到很多来源建议只从官方社区版渠道拿避免第三方打包的二流安装包。版本选择要注意和JDK的搭配PDI 8.x对应Java 8PDI 9.x也需要Java 8或11太新的JDK反而容易起不来。安装过程就是解压到本地目录Windows双击Spoon.batLinux/Mac执行spoon.sh。启动慢是常态第一次起可能要等一两分钟。有个提升体验的小技巧如果本机内存够把启动脚本里的JVM参数从默认值调大一点比如 -Xms512m -Xmx2048m处理较大数据量时没那么容易卡死。但如果机器本身没多少内存硬调大反而把系统拖垮自己掂量。还需要注意Kettle的解压目录不要放在带空格或中文的路径下我看到最多的问题是“明明装好了双击没反应”或“日志报找不到文件”十有八九是路径不对。老老实实放到C:\pdi或者D:\tools这种纯英文路径。2.2 新建转换认识主界面打开Spoon后文件菜单里选“新建转换”会生成一个ktr文件。主界面分成几大块左侧是“核心对象”树按类别放了所有步骤中间大画布是你放步骤、连跳的地方顶部工具栏有运行、暂停、重置、调试按钮下方是“执行结果”区域跑完看日志、看步骤度量。我第一次用Spoon时不知道左右两栏怎么摆后来发现默认布局就挺好。左边核心对象树有搜索框输入“排序”“过滤”能快速找步骤。画布支持右键菜单也可以拖拽连线。运行按钮绿色三角像播放键调试按钮能一步步看数据流后面我会提到。数据库连接对象在“转换”里叫“数据库连接”可以右键“DB连接”或从主菜单“文件 - 数据库连接”新建。Kettle的连接配置会被存到共享仓库或XML里多个转换可以复用但要注意不同环境开发、测试、生产的连接参数是不一样的建议用变量或环境配置来管理。2.3 数据源准备先让测试数据可控新手练习时别一上来就接生产库几十个字段容易看不清楚。我建议先用一个几十行的Excel文件加一张本地MySQL或PostgreSQL表来练。Excel文件最好第一行就是列名别合并单元格别在数据里混入空行。数据库表则建议字段名用英文类型清晰别跟数据库保留字撞车。你这样准备之后可以把注意力集中在Kettle本身的逻辑上。等把一个简单转换跑通了再逐渐增加复杂度。很多人没跑通不是步骤配错了而是数据源本身脏乱比如Excel里有公式缓存、空字符串、数字存成文本这时候Kettle报错你会分不清到底是谁的问题。3. 完整实操从Excel文件到数据库表3.1 配置Excel输入步骤我们做一个最常见的场景把一张用户信息Excel导入到数据库的user表。先拖入“Excel输入”步骤双击打开配置界面。第一步“文件”页签浏览选Excel文件。Kettle支持.xls和.xlsx如果文件有多种工作表这里可以点“获取工作表名称”添加只处理你需要的那张表。第二步“工作表”页签选择具体Sheet名。第三步“内容”页签可以设置头部行在第几行、列分隔符等转换到Excel一般默认就行。真正关键的是“字段”页签。你可以点“获取字段”Kettle会自动读取Excel列头生成字段列表。这里一定要逐个检查字段名、类型、长度是否和你预期一致。比如日期列有时被读成String金额列被读成Number如果目标表是date和decimal就要在这里先调整类型。这是转换里最简单也最容易被忽略的步骤类型设置。配置完后可以先点“预览”看看Kettle读出来的数据长什么样。如果预览结果不是你想要的千万别继续往下配先回头修输入配置不然问题会被带到下一步越滚越大。3.2 配置数据库连接和表输出拖入“表输出”步骤双击新建数据库连接。以MySQL为例连接方式选“MySQL”填主机名、端口、数据库名、用户名、密码。这里有个坑Kettle的老驱动对MySQL 8以上版本支持不太好容易报SSL或时区错误。解决办法是在连接属性里加 useSSLfalse 和 serverTimezoneAsia/Shanghai或者直接换新版Connector/J驱动jar包放到lib目录下。建好连接后在“表输出”的“目标表”里填表名。如果目标表在数据库里不存在可以点“SQL”按钮让Kettle根据输入流自动建表这对快速验证非常方便。但生产环境不建议还是让DBA审过再建。“提交记录数量”是个关键参数。默认值是1000意思是每攒够1000条数据才提交一次事务。如果数据量很大这个值可以调成5000或10000减少事务开销。但如果中途有一条数据插入失败回滚范围也会变大要根据业务容忍度权衡。我在本地练习时调成200就够。最后是“数据库字段”页签Kettle通常会自动匹配源和目标字段。如果字段名对不上需要手动拖动或映射。这里千万注意表输出只是把输入流中的字段直接插入目标表它不做字段转换所以源字段类型如果和目标表不匹配会直接报错。需要提前在中间加“字段选择”来处理。3.3 连接跳并运行两个步骤都配好后按住Shift键从“Excel输入”底部拖一条线到“表输出”顶部松开鼠标就生成一个跳。如果你看到箭头从下往上或乱跑可以右键删除重连。然后点工具栏绿色运行按钮在弹出的界面里可以直接点“启动”Kettle会开启本地引擎执行这个转换。运行过程中下方“执行结果”标签页会同步显示日志。跑完之后展开“步骤度量”节点能看到每个步骤处理的输入行数、输出行数、错误行数。如果发现Excel读了1000行表输出只写了999行肯定是有一行处理失败了。这时候要看“日志”里的错误信息它是定位问题的第一现场。Kettle的运行模式也有讲究。默认是本地运行适合调试。生产环境可以用“服务方式”“远程”或通过调度工具执行。普通教程很少说这一点但你知道有这么回事就行初期不要被这里的选项吓到。3.4 查看目标表数据验证结果转换跑完后别只盯着“执行成功”的提示。我见过不少同行认为“没报错就是成了”结果目标表里数据量不对、字段错位。更好的习惯是跑到数据库里执行 select count(*) from user和对账表比对一下。如果发现数据不齐可以回到Kettle里给“表输出”前面临时加一个“文本文件输出”步骤把流里的数据打印出来看快速定位是哪一步丢的数据。这个“打印到文件”调试法虽然土但很好用。尤其是数据经过多个步骤后到底哪一步开始不对把每一步输出先导出成CSV一查便知。熟练之后你可以用“调试”按钮里的“预览”功能在步骤之间直观看数据但遇到复杂逻辑时CSV文件仍然是可回溯的证据。4. 常用转换步骤和参数化技巧4.1 字段清洗和质量控制做过真实数据项目的人都知道数据不会像教程里那么干净。数字列里可能有空格日期列里有“2024/1/5”和“2024-01-05”混用字符串列有空值和“无”。Kettle里最常用的清洗三件套是“字段选择”“过滤记录”“值映射”。“字段选择”可以重命名字段、指定类型、设置长度精度。它的“获取更改过的字段”按钮能自动把变化应用进去。在“元数据”页签里把“name”改成“user_name”把类型从String改成Number长度设好。注意类型转换失败时Kettle会输出错误行不会覆盖原来的字符串这是好事你可以在日志里看到原因。“过滤记录”步骤用于按条件分流。比如把 age 18 的数据发到下一步把不满足条件的发到另一个步骤或直接丢弃。配置条件时要特别注意字段大小写和类型字符串字段的比较要注意去空格。如果条件里写了 age ! 18而age是整数类型很可能得到意外结果。这类问题不报错但结果就是不对排查起来很费劲。“值映射”适合做编码转换比如把性别字段里的“0”“1”“男”“女”统一成标准值。它本质上是一个查找表输入值在“源值”列输出值在“目标值”列匹配不到时可以设置默认值。这个步骤比写Switch/Case更直观也更容易维护。我在很多转换里都靠它把杂乱字典收敛成标准枚举。4.2 字符串和类型转换热搜里常看到“字符串字母大小写转换”在Kettle里最直接是用“字符串操作”步骤。它有一个“Lower/Upper”选项可以给指定的字段做小写或大写转换还能设置去空格、去尾部空格等操作。另一个办法是用“脚本”组件里写JavaScript或Java表达式但能不用脚本就不用脚本性能和可维护性都更好。关于类型转换新手容易问“为什么我字段明明是数字Kettle非说是字符串”这通常发生在Excel输入或CSV输入阶段读取时列类型识别成了文本。解决办法是在输入步骤的字段定义里手动指定类型不要指望Kettle自动识别。跟数据库打交道时也可以用“字段选择”里的元数据tab统一改类型。还有“数据转换”类步骤如“Normalize”“Denormalize”是更复杂场景初期不用碰。大小写转换常见于编码处理和姓名标准化。比如身份证号最后的X有人录入小写x有人录大写X如果你用“字符串操作”统一转为大写后面和接口对账就少很多坑。这种细节看着小但能救你半夜被叫起来排查对不齐的命。4.3 多表数据怎么合并到一个目标表实际项目里“多表合并抽到一个表”太常见了。比如你有两张表一张存用户基本信息一张存用户扩展信息要把它们合并成一张宽表。Kettle里有几个思路如果多个来源字段结构完全一致只是不同表或不同分区可以用“追加流”步骤把多个流纵向拼接。如果需要按照某个字段做关联可以用“记录集连接”或“数据库连接”步骤类似SQL里的inner join、left join。如果是缓慢变化维的场景则要考虑“合并记录”加“数据同步”的组合这属于作业级的同步策略。“追加流”很好理解把两个步骤的输出顺序连到同一个下一步骤数据会先流完第一个再流第二个。“记录集连接”则要求两个排序好的输入流按关键字段连接。注意连接前必须对关键字段排序否则结果可能错乱。“数据库连接”是在数据库端做join速度通常更快但要求数据库能连到数据源。如果只是把两个结构相同的Excel文件抽到一个表里“追加流”就够了。但如果要做按时间增量抽取每个增量文件都要合并历史数据就要考虑目标表是“先清后插”还是“插入更新”。这个问题放到讲同步时再细说。4.4 参数、变量和时间参数从哪里配Kettle转换里写死路径和SQL是新手常见问题。更好的做法是用参数和变量。在转换空白处右键“设置”里可以添加“参数”比如定义 startDate、endDate默认值填当天。在表输入步骤的SQL里写 select * from orders where order_date ${startDate}运行转换时在弹出的参数窗口里输入值。这样同一个转换就能复用到多个日期批次。全局环境变量在Spoon的菜单栏“工具 - 设置”里可以配置也可以修改 .kettle/kettle.properties 文件。常见的用法是放数据库连接参数、文件路径前缀、运行环境标识等。用${变量名}引用即可。测试环境、生产环境通过切换配置文件来切换不用改转换本身。“转换里的时间参数在哪里”是很多人会搜的问题。简单说你可以把时间参数定义成命名参数也可以直接用Kettle内置变量。我习惯用“获取系统信息”步骤中的“系统日期”字段或者写SQL时用数据库函数取时间比如MySQL的 NOW()。如果调度周期是每天跑前一天数据作业调度器里传入日期参数更方便转换本身保持纯计算逻辑。4.5 插入更新同步和定时任务的基础热词里还有“数据更新同步定时任务配置”对应的Kettle步骤是“插入/更新”。它与“表输出”不同不是简单插入而是会拿着关键字段去目标表查如果记录存在就更新不存在就插入。配置时先填目标表然后指定用来判断是否为同一行数据的“用于查询的关键字”字段最后映射要更新的字段。“插入/更新”非常强大但也要注意性能。如果目标表数据量很大且用于查询的关键字段没有索引每一次判断都会慢整体会很痛苦。正确做法是给目标表的关键字段建索引并且在转换里尽量把输入流按关键字段排序后再进入“插入/更新”能提高命中率。定时调度通常不在转换里做而是在作业里配“Start”的时间策略例如每分钟、每小时、每天定点执行再把转换作为作业的一个节点。这样就能实现“数据更新同步定时任务”。作业里还可以加“成功”和“失败”跳失败后发邮件或者重跑这是转换本身做不到的。5. 常见报错和排查技巧5.1 数据库连接和驱动类问题“连接失败”是Kettle最常见的报错之一。报错信息里如果出现 ClassNotFoundException多半是驱动jar没放对位置。记得把对应数据库的JDBC驱动jar包拷到Kettle的lib目录然后重启Spoon。注意MySQL 8要装mysql-connector-java 8.x版本Oracle和SQL Server同理版本要匹配。还有一类是连接URL或认证方式不对。比如SQL Server要用“net.sourceforge.jtds.jdbc.Driver”而新版驱动是“com.microsoft.sqlserver.jdbc.SQLServerDriver”。你可以在数据库连接配置里的“选项”页签调整。遇到时区、SSL问题也大多可以通过URL参数解决。我的经验是先把数据库客户端工具连上再用同样的主机端口库名用户名密码去Kettle里配减少低级错误。5.2 字段和类型不匹配“Couldnt convert String to Integer”这类报错意味着Kettle想把一个字符串转换成数字但源数据里有非数字字符比如“123abc”或者空字符串。处理办法是在进入目标转换步骤前用“字段选择”设置正确的类型用“过滤器”把非法字符的行剔除或者用“值映射”“正则表达式”清洗字段。千万不要在目标表步骤里硬转它会直接让写入失败。另外中文乱码也常被归为“类型不匹配”。实际上乱码多半是输入文件编码不是UTF-8。可以在文本文件输入步骤的“内容”页签里设置编码比如改成 GBK 或 UTF-8。Excel输入一般不存在编码问题但CSV文件很常见。读取时设置好写入数据库时还要注意连接URL里的 characterEncodingutf8否则结果就是问号。5.3 数据量一大就内存溢出或卡死转换处理几十万行可能没事几百万行就卡住通常是内存和配置问题。首先检查输入步骤有没有把不必要字段读进来字段越少内存占用越低。其次“排序记录”步骤非常吃内存默认排序在内存里做数据量大时务必设置“排序缓存大小”并用临时文件。最后尽量减少“行集缓冲区”的默认大小不是越大越好的要根据实际吞吐设置。我踩过一个坑给“表输入”写了 select * from 一个亿级大表Kettle直接OOM。后来在SQL里只取需要的字段加上分页条件再用“表输出”批次提交内存占用降了很多。Kettle不是大数据存储的对手真要处理上亿级别的数据建议用Spark或Flink不要硬扛。5.4 排查问题时的操作顺序遇到转换莫名其妙出错我的排查顺序是先看日志里的第一个Error别找后面的几十行再看步骤度量里哪个步骤的错误行数大于0然后用预览在该步骤后面抽样看数据最后不行再加临时文件输出。很多人直接去改SQL或清缓存反而越改越乱。Kettle里每个步骤都有一堆配置项报错信息有时很隐晦。这时候把画布上从出错步骤往前推逐个步骤用“预览”看输出通常两三次就能定位。这个习惯比记住一百个报错原因更重要。6. 我常用的几个小习惯最后说几个我自己觉得提高效率的做法。一个是给转换里的步骤都取有意义的名字比如“读用户明细”“清洗手机号”“写入用户表”这样日志里一眼知道跑到哪了。另一个是把数据库连接和文件路径尽量放在变量里换环境时不用改十几个地方。还有一个习惯是定期清理转换里的临时输出步骤。调试时加的“CSV文件输出”最后记得删掉不然每次跑都会生成一堆调试文件容易混进生产数据。如果你把转换提交到代码仓库更要注意不要提交带密钥的数据库连接配置用变量或配置文件来管理。Kettle转换真正上手之后你会发现它就像一个数据流水线前期多花时间在数据源分析、字段定义和步骤规划上后期跑起来会特别省心。遇到问题不要慌按日志、度量、预览那套流程来绝大多数坑都有迹可循。希望这篇能让你少走点弯路。
返回列表