1. 程式人生 > >Kettle實現迴圈增量抽取資料

Kettle實現迴圈增量抽取資料

資料量數以千萬計時,初次一次性抽取歷史資料容易出現卡死,針對這種情況可以使用迴圈年份抽取,並且加入增量程式使得後續抽取增量化!

整體流程:


1、獲取年份極值(獲取歷史有資料的年份最大最小值)



獲取日期:

select min(to_char(jyrq,'yyyy')) || '~' || max(to_char(jyrq,'yyyy')) YearRange from veh_is_warning where to_char(jyrq,'yyyy')>=?

2、獲取時間範圍(通過切分獲得歷史年份最大最小值)

var prevRow=previous_result.getRows();
var listv=previous_result.getRows().toString().split("~"
);//切分為陣列
if (prevRow == null && (prevRow.size()==0))
{
false;
  
}else{
    parent_job.setVariable("startTime",listv[0].substr(2,4));//最小年份
    parent_job.setVariable("endTime", listv[1].substr(0,4));//最大年份
    
true;
}

3、檢測欄位值(從最小年份開始迴圈抽取資料)


4、獲取目標表上次同步最大時間(設定目標庫上次同步完的最大時間)



上次同步最大月份:

select nvl(to_char(max(tjrq),'yyyymmdd'),'19700101') maxUpdateRq from MON_FACT_UNUSUAL_WARN where tjrq<=trunc(sysdate-1)

5、檢驗異常預警情況統計(資料條件控制)



資料來源veh_is_warning:

select sum(1) yjs
,t.jyrq tjrq,nvl(t.jcxdh,'NA') jcxdh,nvl(t.jyjgbh,'NA') jyjgbh,
nvl(t.glbm,'NA') glbm,nvl(t
.fzjg,'NA') fzjg, 
nvl(t.yjlx,'NA') yjlx,
--t.hpzl,t.hphm,d.hphm,
nvl(d.cllx,'NA') cllx
from veh_is_warning t 
left join vehicle d on t.hphm=d.hphm
where t.yjzt=1
and to_char(t.jyrq,'yyyy')='${startTime}'
and to_char(t.jyrq,'yyyymmdd')>='${P_MAXUPDATERQ}'
group by 
t.jyrq,t.jcxdh,t.jyjgbh,t.glbm,t.fzjg, 
t.yjlx,
--t.hpzl,t.hphm,d.hphm,
d.cllx

6、控制迴圈次數

var size = new Number(parent_job.getVariable("endTime"));
var i = new Number(parent_job.getVariable("startTime"))+1;
  
if(i<=size){
parent_job.setVariable("startTime", i);
}else
{
 parent_job.setVariable("startTime", 1);//控制退出
parent_job.setVariable("endTime", 0);//控制退出
}
 
true;