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;
Kettle循环抽取数据的步骤如下: 1. 首先,你需要创建原始表和目标表。原始表可以是school和school1,目标表可以是school_kettle和school1_kettle。这些表需要在Kettle中提前建好。 2. 第二步是使用分页行号节点来获取分页的数值。你可以使用以下SQL语句来实现这一步骤: ``` SELECT a.rownum FROM (SELECT @rownum:= @rownum + 1 AS rownum, m.* FROM (SELECT @rownum := 0) t,`palm_clinic_payment_bill` m) a WHERE a.rownum <= ? ``` 这个SQL语句会返回分页的行号。 3. 如果你获取不到字段或者字段比较多,可以使用一个小技巧。将上一步的分页查询的SQL中的变量替换成数字1,表示查询第一页。这样你可以直接运行这个SQL语句,然后在表输出的时候获取全部的字段。这样就不用一个个选择字段了。在填写数据库字段、表字段和流字段时,记得将上一步的SQL还原。 这样,你就可以在Kettle循环抽取数据了。希望对你有帮助!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [使用Kettle循环处理数据(方式一)](https://blog.csdn.net/qq_45083975/article/details/121848746)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v12^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Kettle分页循环抽取全量数据,三步搞定](https://blog.csdn.net/GordoHu/article/details/129703977)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v12^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值