过滤记录可用于做增量添加,假设id是自增的,从源表中获取数据插入目标表,如果数据量过大,全表更新导致速度十分慢。这时候可以从源表查询数据,过滤掉id小于目标表最大id的数据,这样可以实现基于id的增量添加。
数据量过大可能导致最开始查询时速度过慢,业务中是把Kettle做成了WEB项目,通过前端来输入查询语句,一般会输入SELECT * FROM tableName,有可能加上WHERE来筛选一下。最好是在原语句中加入比较id大小的条件从而减少查询数据。
但是:
第一,前端不知道目标表最大id,当然可以在传表对象的时候代入。
第二:你永远不知道前端会传什么语句过来,所以也不知道怎么拆除替换前端传过来的sql语句。
使用过滤记录:
优点:保证原有的功能正常不出问题,我只是过滤了前端查询的数据,他具体查什么还是查什么。相比全量插入条数减少。
缺点:查询总数还是不变,好在查询效率相对较高。
源表:
id已经达到161829000,也就是有161829000条数据
目标表:
可以看到目标表最大id为:73367168,所以在同步时源表会从大于 73367168的id开始插入。
看一下kettle过滤记录的原型图:
过滤记录的代码:
/**
* 过滤记录
* @param stepName 步骤名
* @param transStepName 目标名
* @param primaryKey 对比字段
* @param maxId 目标表的最大id
* @return StepMeta
* @throws KettleValueException
*/
public StepMeta setFilter(TransMeta transMeta, PluginRegistry registry, String stepName, String transStepName, String primaryKey , Long maxId) throws KettleValueException {
// 创建过滤对象
FilterRowsMeta filterRowsMeta = new FilterRowsMeta();
filterRowsMeta.setDefault();
// 不符合条件的数据
// filterRowsMeta.setFalseStepname("");
// 符合条件的数据
filterRowsMeta.setTrueStepname(transStepName);
// 加载插件
String pluginId = registry.getPluginId(StepPluginType.class, filterRowsMeta);
// 设置过滤条件
Condition condition = new Condition();
// 设置左边字段名字
condition.setLeftValuename(primaryKey);
// 设置比较条件(大于)
condition.setFunction(Condition.FUNC_LARGER);
// 添加取反?
condition.setNegated(false);
// 设置右边的值
condition.setRightExact(new ValueMetaAndData(String.valueOf(maxId), maxId));
// 添加比较条件
filterRowsMeta.setCondition(condition);
// 返回
StepMeta filterMeta = new StepMeta(pluginId, stepName, filterRowsMeta);
// 添加到转换元中
transMeta.addStep(filterMeta);
// 返回
return filterMeta;
}
其它:
/**
* 创建转换插件
* @return
*/
public PluginRegistry getRegistry() {
// 插件注册,用于注册转换中需要用到的插件
return PluginRegistry.getInstance();
}