SpringBoot集成Kettle添加过滤记录

        过滤记录可用于做增量添加,假设id是自增的,从源表中获取数据插入目标表,如果数据量过大,全表更新导致速度十分慢。这时候可以从源表查询数据,过滤掉id小于目标表最大id的数据,这样可以实现基于id的增量添加。

        数据量过大可能导致最开始查询时速度过慢,业务中是把Kettle做成了WEB项目,通过前端来输入查询语句,一般会输入SELECT * FROM tableName,有可能加上WHERE来筛选一下。最好是在原语句中加入比较id大小的条件从而减少查询数据。

基于:SpringBoot集成Kettle,并支持拓展插件_L990616_ss的博客-CSDN博客

 但是:

        第一,前端不知道目标表最大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();
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值