
简介《kettle设置循环变量》是一份面向Kettle/ETL初学者与数据集成开发者的单篇docx文档聚焦在作业中按多个表名循环抽取、统计时的变量设置与循环控制问题。文档围绕Trans脚本、获取表数量、循环控制器、获取表行数和计数器累加等步骤梳理如何把查询出的表名逐条设为变量并替换${TABLENAME}帮助读者理解Kettle变量一次只接收一个值时的遍历处理思路。压缩包共1个docx文件大小约282KB内容以实现思路和步骤说明为主便于快速查阅和对照实践。该文档已有2545人学习适合需要补齐Kettle循环作业配置、表名动态替换及流程排错思路的读者参考。1. Kettle 4.4 循环变量安装前夜先分清 JDK、结果集和变量作用域Kettle 循环变量这套配置最容易翻车的不是点开“设置变量”而是装完 Kettle 4.4 后变量作用域、结果集和循环控制器三件事没对齐。我见过一个老 ETL 作业在测试库只跑第一张表日志里 TABLENAME 从头到尾没变最后查出来是计数器累加步骤没有回连循环控制器。Kettle 4.4 是不少老数据抽取项目还在用的版本装它要配同时代 JDK、放对数据库驱动还要把 User_Tables 里的 Table_Name 取出来变成可循环的变量。适合正在维护老 Kettle 作业、需要按表名批量统计行数或批量抽取的开发者新手照着连线能跑通熟手重点看变量作用域和结果集传递。2. 安装 Kettle 4.4从 JDK 到数据库驱动一次配齐Kettle 4.4 的安装不是一路“下一步”就完事。它属于老一代图形化 ETL 工具Spoon 启动依赖图形环境和 JDK作业在服务器上跑又依赖 kitchen.sh、pan.sh 和数据库驱动。先把环境列清楚比装到一半再找后悔药强。下面这套组合是我在维护老作业时常用的基线读者可以按自己机器调整路径但版本代际不要乱跨。组件建议说明Kettle4.4与原文环境保持一致JDK6 或 7 这一代与 4.4 同时代别直接拿很新的 JDK 去开 Spoon图形环境Spoon 设计时需要服务器无界面时用 kitchen.sh 跑作业数据库驱动与目标库匹配的 jar放 Kettle 的 lib 目录清单表User_Tables字段 Table_Name测试时可用 ETL_TABLE_LIST 模拟2.1 选 JDK 与配 JAVA_HOME老版本别直接追新Kettle 4.4 自带的老组件对高版本 JDK 并不友好常见表现是 Spoon 闪退、界面打不开或者数据库驱动加载时报一些看不懂的类找不到。我的习惯是先给它配 JDK 6 或 7 这一代把 JAVA_HOME 指到 JDK 根目录不要把路径写到 bin。配置完先在终端验证 java -version再去启动 Spoon这样出错时能快速判断是 JDK 问题还是 Kettle 本身问题。# 以 Linux 为例路径按自己的 JDK 安装目录改 export JAVA_HOME/opt/jdk7 export PATH$JAVA_HOME/bin:$PATH # 必须能看到 1.6 或 1.7 这一代的版本输出 java -version这段命令只做两件事把 JAVA_HOME 指向 JDK 根目录把 bin 目录前置到 PATH。参数里最容易写错的是 JAVA_HOME写成 /opt/jdk7/bin 后Spoon 启动脚本会再拼一次 bin结果找不到 java。另一个常见问题是系统里装了多个 JDK终端 java -version 是对的图形界面启动时又读到另一个所以配置完要在同一个终端里启动 Spoon别在桌面图标里直接双击。2.2 解压 Kettle 4.4 与放驱动lib 目录少一个 jar 就白装Kettle 4.4 一般是压缩包分发解压到固定目录即可。解压后先给 spoon.sh、kitchen.sh、pan.sh 执行权限再启动 Spoon 看界面能不能出来。数据库驱动要放到 Kettle 的 lib 目录放完重启 Spoon如果是命令行跑作业也要确认 kitchen.sh 用的是同一个 Kettle 目录否则会出现“Spoon 里能连、命令行连不上”的假故障。# 解压到固定目录目录名不要带空格 mkdir -p /opt/kettle4.4 unzip /tmp/kettle-4.4.zip -d /opt/kettle4.4 cd /opt/kettle4.4 # 给启动脚本执行权限 chmod x spoon.sh kitchen.sh pan.sh # 把数据库驱动 jar 放进 lib文件名按实际驱动改 cp /tmp/your-db-driver.jar /opt/kettle4.4/lib/ # 确认 jar 已经在 lib 下 ls -l /opt/kettle4.4/lib | grep -i driver # 有图形界面时启动设计器 ./spoon.sh这段命令的关键参数是解压目录和驱动位置。Kettle 4.4 启动时会加载 lib 下的 jar驱动没放进去新建数据库连接测试时就会报驱动类找不到。驱动版本也要和目标数据库匹配太新的驱动配老库、太老的驱动配新库都可能连不上。命令行入口要记清Spoon 用来画作业和转换kitchen.sh 跑作业pan.sh 跑转换服务器上一般不启图形界面设计在本地做好再把作业文件传上去跑。2.3 建数据库连接与测试表先确认 Table_Name 能读出来装完 Kettle 后不要急着画循环先建数据库连接再跑一条最简单的表名查询。连接名称可以叫 ETL_SOURCE主机、端口、数据库名、用户名、密码按实际填驱动 jar 选刚放进 lib 的那个。连接建好后点测试测试通过只说明网络和账号没问题还要在“表输入”里预览一次查询结果确认 Table_Name 字段真的能读出来。连接项示例值注意连接名称ETL_SOURCE作业里靠这个名字找连接主机127.0.0.1按实际数据库地址改端口按数据库实际端口不要照抄示例数据库名demo测试库用户名etl_user只读账号即可密码按实际填不要写进作业文件明文传播驱动 jaryour-db-driver.jar必须放 lib测试时可以先建一张清单表模拟原文的 User_Tables字段名保持 Table_Name再建两张模拟表 T_A、T_B 用来统计行数。生产环境里把 ETL_TABLE_LIST 换成 User_Tables 即可SQL 里只改 FROM字段别名不动。这样做的目的是先把“取表名”和“循环变量”拆开验证避免一上来就连生产系统视图出错后分不清是权限问题还是变量问题。-- 测试用清单表模拟 User_Tables 里的 Table_Name 列 CREATE TABLE ETL_TABLE_LIST ( Table_Name VARCHAR(64) ); INSERT INTO ETL_TABLE_LIST (Table_Name) VALUES (T_A); INSERT INTO ETL_TABLE_LIST (Table_Name) VALUES (T_B); -- 两张模拟业务表用来验证循环统计行数 CREATE TABLE T_A (id INT); CREATE TABLE T_B (id INT);这段 SQL 只建最小结构不涉及真实业务数据。Table_Name 用字符串存表名T_A、T_B 是模拟表生产里换成实际表名。执行完在 Kettle 的表输入里写SELECT Table_Name FROM ETL_TABLE_LIST ORDER BY Table_Name预览能看到两行说明后面取表名的 Trans 有数据来源。如果预览报字段不存在先检查数据库里字段实际大小写有些库会把未加引号的字段名转成大写Kettle 里看到的字段名可能和手写的不一致。3. 取表名 Trans 配置把 User_Tables 的 Table_Name 复制到结果循环变量的第一步不是设变量而是把表名列表从数据库里取出来并且让作业能接住这份结果。Kettle 里的“结果集”和“变量”是两套东西结果集可以有多行变量一次通常只有一个值。原文场景里 User_Tables 存着多个 Table_Name所以先用一个转换把表名查出来再用“复制记录到结果”把行传到作业最后在作业里把多行表名转成可循环的变量。这个顺序反了后面就会遇到“变量只拿到最后一张表”的坑。3.1 表输入 SQL 与字段别名Table_Name 大小写先统一取表名的转换里核心步骤就是“表输入”。SQL 可以写成SELECT Table_Name FROM User_Tables但不同数据库返回的字段名大小写可能不一样所以我会在 SQL 里显式起别名让 Kettle 下游统一按 Table_Name 取。排序也要加否则循环顺序不稳定排查日志时很难对照。表输入里如果有变量要勾选“替换 SQL 语句里的变量”这一步取表名没有变量但养成检查这个选项的习惯后面循环体里才不会漏。-- 取表名列表别名固定为 Table_Name排序保证循环顺序可复现 SELECT Table_Name AS Table_Name FROM ETL_TABLE_LIST ORDER BY Table_Name;这段 SQL 的逻辑很直白从清单表里取表名显式别名按表名排序。参数上重点是别名和排序别名让 Kettle 字段名稳定排序让每次运行顺序一致。生产里把 ETL_TABLE_LIST 换成 User_Tables如果系统视图字段本身是大写可以在“字段选择”步骤里把字段重命名为 Table_Name别在 JavaScript 里写一堆大小写判断。表名两边的空格也要处理后面设置变量前会统一 trim。3.2 复制记录到结果结果集不是变量别混用表输入查到多行后要加“复制记录到结果”步骤。这个步骤在转换里执行作用是把当前行复制到转换结果集作业里的下一步才能拿到。它不会自动把 Table_Name 变成一个叫 TABLENAME 的变量也不会只保留第一行。很多人在这里误以为加了“复制记录到结果”就等于设置变量结果循环体里${TABLENAME}是空值SQL 直接报语法错误。配置项值说明步骤类型复制记录到结果转换内步骤复制字段不选复制全部只需要 Table_Name 也可以结果集当前转换结果作业同一次运行内有效下游作业里的转换步骤不是作业步骤本身配置时不需要勾太多字段默认复制全部行即可。关键是这个转换要被作业里的“获取表的数量”步骤调用并且转换执行完后结果集要能传到作业。结果集只在同一次作业运行内有效作业停了就没了不要指望它跨作业保存。调试时可以在转换里加一个“写日志”步骤把 Table_Name 打出来确认转换本身取到了两行再去看作业有没有接住。3.3 作业里接结果获取表的数量与设置初始化变量作业里先放“获取表的数量”步骤类型选转换指向刚才那个取表名的转换。它执行完后结果集里应该有 T_A、T_B 两行。下一步“执行表数量判断和设置变量”我一般用 JavaScript 步骤把结果集里的表名拼成一个逗号分隔的字符串同时初始化 size、i、TABLENAME。原文里这个步骤负责获取“获取表的数量”运行的结果并设置控制循环和表名变量本质就是在这里完成多行表名到单值变量的转换。// 作业 JavaScript 步骤读取上一步复制到结果的表名初始化循环变量 var rows getRowsFromResult(); var size rows.size(); var names ; for (var k 0; k size; k) { var row rows.get(k); var name row.getString(Table_Name); // 兼容数据库返回大写字段名的情况 if (name null || name ) { name row.getString(TABLE_NAME); } // 去掉首尾空格避免拼 SQL p a hrefhttps://download.csdn.net/download/chen___feng/9671969 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p