kettle的功能此处就不做过多的介绍了,此处主要是记录一下自己第一次使用kettle工具迁移数据的经历.需求:将两个mysql数据库(DB1,DB2)中的数据拷贝到一个中间库(DB3)中,然后在中间库总进行多张表关联查询出最终的结果并输出到另一张表中.所有数据是以店铺号(shop)和商品编码(productSaleId)作为唯一索引.每次需要处理N个店铺的商品.
实现:
编写三个转换(Transformation):
第一个Transformation1根据店铺号(shop)将DB1中的商品数据拷贝到DB3表table1;
第二个Transformation2根据店铺号(shop)将DB2的商品数据拷贝到DB3表table2;
第三个Transformation3根据店铺号(shop)将table1和table2和其它表tablen关联查询将结果输出到result中;
编写一个JOB来将这3个Transformation串起来执行.
顺序为:Transformation1 -> Transformation2 -> Transformation3
此job每次只能处理一个shop的数据,现在有N个店铺需要处理;现在需要只提交一次job处理N个店铺的商品;
改造:将三个转换Transformation中sql的查询条件店铺号用变量'${shop}'代替,店铺号通过设置变量来达到
每次循环处理不同的店铺;
转换中查询数据SQL格式如下,这个SQL并不是真正的SQL,只是一个简单的示例,店铺号使用'${shop}'代替.
切记将选项框:"替换SQL语句中的变量"勾上.这样变量才会生效.
SELECT
id
, shop
, productsaleid
, name
FROM table where shop = '${shop}'
查询出的数据可以直接使用"表输出"输出到指定表中.
循环job的编写此处先上图:
图1:
图2:
图3:
JavaScript文本:
//读取设置的店铺列表,店铺号用英文逗号分隔
var shopList = new String(parent_job.getVariable("shop_list"));
if(shopList.length > 0){
var lastIndex = shopList.lastIndexOf(",");
//截取shopList最后一个店铺号
var shop = shopList.substr(lastIndex+1,shopList.length);
//设置店铺号变量shop
parent_job.setVariable("shop",shop);
//切割掉最后一个店铺号
shopList = shopList.substr(0,lastIndex);
//重新设置修改后的店铺号列表
parent_job.setVariable("shop_list",shopList);
true;
}else{
false;
}
图4:
按照以上图的序号编写job就可以达到循环处理,重点还是为了记录JavaScript脚本.