我们先了解不同于java代码的kettle的一些方法
1、getRow();
获取每一行数据,循环读数据;返回的是Object[]数组
2、get(Fields.in,"字段名");
获取具体的某个字段的名称
3、get(Fields.in,"字段名").getString(r);
获取这一行数据中,对应的字段名并且是值是字符串类型的数据
4、setOutputDone()
结束输出,不往后面的步骤传递数据
5、putRow(outputRowMeta, outputRow);
把数据的结构以及值传给下个数据
6、logBasic("数据是: " +b);
打印基础日志
功能、获取记事本里面的数据,把这个数据进行简单的处理,然后输出;
难点:1、我不想要把处理后的值覆盖掉原来的值,而是创建一个新的字段,给这个新的字段赋值
2、其次我不想要之前的字段,很冗余
记事本配置
java代码如下
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
//1、获取输入行数据
Object[] r = getRow();
//2、若为null,则停止输出
if (r == null) {
setOutputDone();
return false;
}
//3、获取数据
Object a=r[0];
//4、打印日志
logBasic("获取到的数据是 "+a);
//5、创建一个输出行,是基于输入行的数据的,形参个数也一致
r = createOutputRow(r, data.outputRowMeta.size());
//6、给输出行的字段名为yy的赋值
get(Fields.Out, "yy").setValue(r, a+"--hello--");
//7、输出行
putRow(data.outputRowMeta, r);
return true;
}
结果如下
如果不勾选清空结果字段
那么结果就会包含输入行信息
到这里,我们做一个小练习,对redis进行读取与设置吧
1、把redis的jar包放入kettle的lib下
2、重启kettle
3、编写代码
redis set代码
import redis.clients.jedis.Jedis;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
//1、读取输入行信息
Object[] r = getRow();
if (r == null) {
setOutputDone();
return false;
}
//2、获取信息
String kinfo=get(Fields.In,"kinfo").getString(r);
String kname=get(Fields.In,"kname").getString(r);
//3、把redis的key存放到key的字段里
get(Fields.Out,"key").setValue(r,kinfo);
//4、连接redis
Jedis jedis = new Jedis("10.20.1.17", 6379);
// 设置键值对
jedis.set(kinfo,kname);
// 关闭连接
jedis.close();
//5、创建输出行
r = createOutputRow(r, data.outputRowMeta.size());
//6、输出行
putRow(data.outputRowMeta, r);
return true;
}
redis get 代码
import redis.clients.jedis.Jedis;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
Object[] r = getRow();
if (r == null) {
setOutputDone();
return false;
}
String key=get(Fields.In,"key").getString(r);
Jedis jedis = new Jedis("10.20.1.17", 6379);
// 获取键值对
String name = jedis.get(key);
// 关闭连接
jedis.close();
logBasic("获取redis信息 "+name);
putRow(data.outputRowMeta, r);
return true;
}
4、测试运行