数据量成百上千万,使用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;
七、成功
华青莲日常点滴,方便自己,成长他人!