Kettle实现循环控制分批次抽取数据

浏览: 3873

数据量成百上千万,使用kettle同步数据经常出现挂掉的情况,所以生成分段同步数据程序,便于同步数据以及同步进程跟踪,因数据量较大时一次性同步数据很慢,并且同步数据出错时不容易定位,使得重新抽取。

具体实现如下:

一、整体流程


二、Generate the time span,本实例是以当前时间三年内,分月同步数据,流程如下:


1、黑点分析时间生成,此步骤可以不要(多余)

2、Generate the time span string,以当前时间为起点,生成三年月份字符串,如下:

界面:


Code:

//Script here
//var endtim = str2date(ENDTIME);
var myDate = new Date();
var byear = myDate.getFullYear();
var eyear = byear-3;
var month = myDate.getMonth()+1;
var myTims ="";
for(var i=0;i<=36;i++)
{
var yea=addYear(eyear,month,i);
    var mon=formatMonth(Month(month,i));
var temyTims=yea+"-"+mon+"-"+"01";
    myTims = myTims+"~"+temyTims;
}
//var days = Month(month,6);
//var myDatev = addDate(eyear+"-"+month+"-"+days,-1);
function formatMonth(smonth){
var m=smonth;    
if (m<10){
        m = "0"+m;
    }
return m;
}
//var vv = month+1;
//var starttim = byear+month+"01";//开始时间
//var endttim = eyear+month+"01";//结束时间
//var nextdate = starttim.getMonth();
//var dd= myDate.setMonth(myDate.getMonth() + 1);
//var dd1=dd.getFullYear()+"-"+dd.getMonth()+"-"+dd.getDate();
//增加月份
function Month(smonth,num){
 
    var m = smonth+num; 
    
   
    if(m>48){
 
    m=m-48; 
     } else if(m>36){
 
    m=m-36; 
     } else if(m>24){
 
         m=m-24; 
     }  else if(m>12){
 
            m = m-12; 
        }   
return m; 
   }
//增加年份
function addYear(syear,smonth,num){
 
    var m = smonth+num; 
    var y = syear;
     if(m>48){
 
    y=syear+4; 
     } else if(m>36){
 
    y=syear+3; 
     } else if(m>24){
 
    y=syear+2; 
     }  else if(m>12){
 
            y=syear+1; 
        }
   
return y; 
   }

结果:


3、Field selection,保留所需字段(略)

4、take out(-),把时间格式改为yyyymmdd


5、Reserved Field,选择所需字段(略)

6、Copy rows to result,后续应用需要此步骤

三、Initialization variable,定义变量并初始化,进入循环

var prevRow=previous_result.getRows();
var times =36;//循环次数
if (prevRow == null && (prevRow.size()==0))//没有值则停止
{
false;
  
}else{
    parent_job.setVariable("timespan",prevRow);
    parent_job.setVariable("size", times);//存储执行表的总数量
parent_job.setVariable("i", 1);//循环控制变量
    //parent_job.setVariable("startspan",20130701);
parent_job.setVariable("starts",20130701);
true;
}

四、for loop,循环控制


五、业务转换,此转换加入自己的业务,或者可以把变量输出到文件,方便后续查看同步进程


比如:

SELECT ${i},${size},${starts} FROM dual

再输出到文本

六、The loop condition assignment again,循环条件重新赋值

代码:

var list_Tables =parent_job.getVariable("timespan").split("~");//对字符串切分
var size = new Number(parent_job.getVariable("size"));
var i = new Number(parent_job.getVariable("i"))+1;
if(i<=size){
parent_job.setVariable("starts", list_Tables[i]);
}
parent_job.setVariable("i",i);
true;

七、成功

华青莲日常点滴,方便自己,成长他人!

推荐 6
本文由 华青莲 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

3 个评论

图文并茂,非常不错
ok/_\
求作者QQ 我最近在学这个 有好多问题想交流一下!很多细节我都不太懂

要回复文章请先登录注册