Smart's Blog

kettle 使用java代码处理业务

       有时候kettle提供的控件无法满足我们自己一些特定的需求,这时候,我们可以自己编写满足需求的代码语言去满足需求,kettle的脚本控件就提供了这个功能,包括java代码、js代码、sql脚本、正则表达式等等,我们现在看一看如何利用java代码来完成我们的需求。

image

       先看一下需求,现在有两张表,一张是kfc_fact_paymentdetail表(记为k表),表的数据是总订单流水,另一张表是t_credit_transaction(记为t表),表的数据是会员订单流水。要求将k表的数据导入到一个新表中,新表表结构与K表相同,但是新表中新增一个一个标志位,标记该条数据是否属于会员订单。

       第一步,以k表为主表,k.order_unique_id和t.orderid作为关联字段,将t表左联接到k表。

image

       此时,得到的结果集为下图,前面是k表的数据信息,id字段是t表的主键,有值的记录表示该条记录是会员订单。

image

       接下来需要进行的操作是,增加一个isMember字段,标志是否为会员订单,如果id字段不为null,则isMember字段置为1,这一步我们通过下面的java代码控件实现:

image

       左侧的列表是输入流的所有字段,下面红色标注的地方可以在输出流中添加新的字段。然后中间的地方就是我们编写java代码的地方。我们需要在kettle提供的Processor类的processRow方法中处理输入的数据。processRow方法每次获取输入流中的一行数据,方法的返回值如果是true继续获取一下行数据,如果是false则停止获取。上图中我们首先通过getRow()方法获取到一行数据,如果数据不为null,再获取id字段的值并赋值给id变量,如果id变量不为null,就设置对应的输出流中的isMember字段的值为1,最后调用putRow()方法把新的数据行放入到输出流中,输出到下一个步骤。需要注意的是,在结束处理时,一定要调用setOutputDone()方法,表示设置输出结束,这样才会把全部数据输出到下一个步骤。

       最后整个步骤如下图所示:

image

       输出到本地mysql的结果:

image