Kettle 参数
目录
参数种类
Kettle 支持3种参数:位置参数(argument)、命名参数(parameter)、变量(variable)。
参数比较
位置参数(argument) | 命名参数(parameter) | 变量(variable) | |
---|---|---|---|
说明 | 根据参数的位置来设置和读取参数值,用于在kjb外部传入,并在kjb内部使用 | 根据参数的名字来设置和读取参数值,用于在kjb外部传入,并在kjb内部使用 | 根据参数的位置来设置和读取参数值,用于在kjb外部传入,并在kjb内部使用 |
注意 | 1. 参数值只能由外部传入arg1 arg2 arg3 2. 通过位置来取值 3. 只能在转换中(transform)获取到参数值 4. 最多支持10个参数 | 1. 参数值只能由外部传入-param:Key=Value ,Key必须固定,值可以在kjb内部重新赋值2. 可以在作业属性中指定默认值,如果外部不传入,就取默认值 3.可在作业、转换中任意使用 4.不能动态新增 5.通过 ${Key} 或者%%Key%% 使用 | 1. 变量必须在KJB内部定义,在内部赋值,在内部使用(Key=Value) 2. 虽然变量只能在内部定义、赋值和使用,但是因为Key和Value都可以是变量,所以可以从外部(文件、数据库等)读取变量名、变量值,实现动态的变量声明、赋值,功能非常强大 3. 可在作业、转换任意使用 4. 可以动态声明、赋值、使用 5.通过 ${Key} 或者%%Key%% 使用 |
定义 | 不需要定义 | 双击作业(或转换)的空白处,在弹出的“命名参数”标签页,可以设置参数的名字 | 1. 在作业中,通过“通用”->“设置变量”控件定义 2. 在转换中,通过“作业”->“设置变量”控件定义 3. 在作业中,通过“JS脚本”控件设置,如 parent_job.setVariable("VAR1", "abc123") |
赋值 | 1. 在设计界面(spoon.bat)点击执行按钮时,可以在弹出的“Run Options”设置,每次运行都要重新设置 2. 在命令行界面(kitchen.bat)执行.kjb文件时,直接指定。如:sh kitchen.sh -file=/kettle/test.kjb 20150101 abc 123,这里按顺序指定了3个参数,以空格隔开 3. 父作业里面执行一个子作业时,可以在“Job”控件的位置参数标签里指定,可以使用变量 | 1. 在设计界面(spoon.bat)点击执行按钮时,可以在弹出的“Run Options”设置,每次运行都要重新设置 2. 在命令行kitchen.bat执行.kjb文件时,直接指定。如: sh kitchen.sh -file=/kettle/test.kjb -param:P1=20150101 -param:P2=abc -param:P3=123 ,这里指定了三个命名参数P1、P2、P3的参数值,顺序不限3. 父作业里面执行一个子作业时,可以在“作业”控件的“命名参数”标签里指定,可以使用变量,可以使用数据流批量赋值并循环 | 1. 在作业中,通过General->Set Variables控件赋值 2. 在转换中,通过“作业”下的“设置变量”控件赋值,前面必须带有一个“输入”控件(强大的关键点就在这里,“输入”控件有多少,我们就可以有多少种方法去动态设置变量),且“输入”控件生成的记录数必须是1条(也可以是0,此时变量未能赋值) 3. 在作业中,通过“JS脚本”控件设置,如 parent_job.setVariable("VAR1", "abc123") 4. 父作业里面执行一个子作业时,子作业可以自由使用父作业定义的变量,包括重新赋值,不用刻意传递 |
取值 | 新建一个转换,选择“输入”下的“获取系统信息”控件,type选择“命令行参数1、2、3...”,即可读取对应位置的参数值。 | 1. 在所有控件中,末尾带有菱形$号的输入框都可以使用,通过${KEY_NAME} 或者%KEY_NAME% 取值。可以嵌套使用,比如${P1}的内容是ABC${P2}123,那么${P2}的值也会被替代成真实值2. 通过作业里面的JavaScript脚本控件读取,如:parent_job.getVariable("VAR1") 3. 在SQL中使用变量时需要把“是否替换变量”勾选上,否则无法使变量生效。 | 1. 在所有控件中,末尾带有菱形$号的输入框都可以使用,通过${KEY_NAME} 使用。可以嵌套使用,比如${P1} 的内容是ABC${P2}123 ,那么${P2} 的值也会被替代成真实值2. 通过作业里面的JavaScript脚本控件读取,如: parent_job.getVariable("VAR1") |
参数示例
位置参数(argument)
位置参数在“获取系统信息”控件中叫做命令行参数。
可以把位置参数理解成是命令行后边以空格分割的参数(字符串)。
- 作业
- 转换
- 传值方式1
传值方式2
- linux
kitchen.sh -file=/xxxx.kjb -log=/xxx.log 1 2
- windows
Kitchen.bat /file=d:\xxxx.kjb /log=d:\xxxx.log 1 2
- linux
命名参数(parameter)
命名参数可以简单把它理解为“变量”,它可以在作业、转换中使用,也可以在同一个作业的不通转换中传递。
命名参数一个很好的优点就是支持“默认值”,这一特点应用得当可以解决很多业务上的问题。
- 作业
- 设置作业命名参数
测试数据
创建测试表test
CREATE TABLE if not exists `test` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `sex` varchar(4) DEFAULT NULL, `age` int(3) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
创建测试表test1
CREATE TABLE if not exists `test1` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `sex` varchar(4) DEFAULT NULL, `age` int(3) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
初始化测试数据
truncate table test1; truncate table test; replace INTO `demo`.`test` (`id`, `name`, `sex`, `age`) VALUES (1, 'mars', '男', 30); replace INTO `demo`.`test` (`id`, `name`, `sex`, `age`) VALUES (2, 'lucy', '女', 18); replace INTO `demo`.`test` (`id`, `name`, `sex`, `age`) VALUES (3, 'lily', '女', 18);
作业中转换的设置-将命名参数传递给转换
- sql中使用命名参数
select * from test where `age` = ${ktr_age} and sex = '%%ktr_sex%%'
注意:
sql 中使用变量的两种方式
${命名参数}
或%%命名参数%%
sql 中使用变量必须勾选“替换 SQL 语句里的变量”
- sql中使用命名参数
作业中配置命名参数传值给作业将命名参数传递给转换
- 转换-转换之间获取命名参数
- 作业中转换的设置-作业转换之间获取命名参数
注意:
- 需要勾选 Options tab页下的“执行每一行输入”,这样才能保证获取到上一个转换结果的每一行数据
- 命令参数tab页,使用流列名映射上一步输出的结果字段,命名参数通过“获取参数”获取本转换设置的命名参数
- 传值方式1
传值方式2
- linux
kitchen.sh -file=/xxxx.kjb -log=/xxx.log -param:kjb_age=18 -param:kjb_sex=女
- windows
Kitchen.bat /file=d:\xxxx.kjb /log=d:\xxxx.log /param:kjb_age=18 /param:kjb_sex=女
- linux
变量(variable)
变量分为局部变量和全局变量,全局变量在kettle.properties
中配置,多为系统级别内容,这里主要说局部变量。
局部变量一共有4个作用域:
Valid in the virtual machine: 在 jvm 虚拟机中有效
Valid in the parent job:在父作业中有效
Valid in the grand-parent job:在当前作业中有效
Valid in the root job:在根作业中有效
注意: 局部变量声明后不能在当前转换里使用,因此需要合理的配置作业中“设置变量”所处的位置,把需要引用局部变量的转换放在“设置变量”之后的转换中来实现需求。
下面是一个综合的示例,介绍如何通过“设置变量”、“获取变量”、“js 脚本”(作业和转换中 js 脚本方式不一样)控件操作变量。
- 作业
- 作业-设置变量-测试变量
- 作业-JavaScript-获取并修改变量
- js 脚本内容
// 日志 var subject = "自定义日志输出-方式2"; var log = new org.pentaho.di.core.logging.LogChannel(subject); // 变量初始值 log.logMinimal("**********************变量tmp初始值:"+parent_job.getVariable("tmp")); log.logMinimal("**********************变量tmp1初始值:"+parent_job.getVariable("tmp1")); log.logMinimal("**********************变量tmp2初始值:"+parent_job.getVariable("tmp2")); log.logMinimal("**********************变量tmp3初始值:"+parent_job.getVariable("tmp3")); // 变量赋值 // 变量初始值 parent_job.setVariable("tmp","2"); parent_job.setVariable("tmp1",3); parent_job.setVariable("tmp2","2024-02-02"); parent_job.setVariable("tmp3","efg"); log.logMinimal("**********************变量tmp在js中赋值后:"+parent_job.getVariable("tmp")); log.logMinimal("**********************变量tmp1在js中赋值后:"+parent_job.getVariable("tmp1")); log.logMinimal("**********************变量tmp2在js中赋值后:"+parent_job.getVariable("tmp2")); log.logMinimal("**********************变量tmp3在js中赋值后:"+parent_job.getVariable("tmp3")); true;
- js 脚本内容
注意: js脚本在作业中获取变量使用parent_job.getVariable("tmp")
,赋值变量使用parent_job.setVariable("tmp","2")
与转换中不一致
- 转换-转换设置变量
转换-转换获取变量
- js 脚本内容
//Script here Alert("转换获取ktr_tmp1变量值为:"+ktr_tmp1) ; Alert("kjb中tmp变量值:"+getVariable("tmp","default")) ; Alert("转换设置中ktr_a变量值为:"+getVariable("ktr_a","default")) ; setVariable("ktr_a","123","r"); Alert("js中ktr_a变量值为:"+getVariable("ktr_a","default")) ;
- js 脚本内容
注意: js脚本在转换中获取变量使用getVariable("ktr_a","default"))
,赋值变量使用setVariable("ktr_a","123","r")
与作业中不一致