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
    评论
你可以使用Spring Boot来集成Kettle,以下是一些步骤: 1. 首先,将Kettle的依赖添加到你的Spring Boot项目中。可以在项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.pentaho</groupId> <artifactId>kettle-core</artifactId> <version>8.3.0.0-371</version> </dependency> ``` 2. 创建一个Kettle的配置类,用于初始化Kettle环境。在这个类中,你可以设置Kettle的一些配置信息,如数据库连接等。示例代码如下: ```java @Configuration public class KettleConfig { @PostConstruct public void init() throws KettleException { KettleEnvironment.init(); } // 其他配置信息 } ``` 3. 创建一个Kettle的服务类,用于执行Kettle的转换或作业。在这个类中,你可以使用Kettle提供的API来加载、运行和监控转换或作业。示例代码如下: ```java @Service public class KettleService { public void runTransformation(String transformationPath) throws KettleException { // 加载转换 TransMeta transMeta = new TransMeta(transformationPath); // 创建转换 Trans trans = new Trans(transMeta); // 执行转换 trans.execute(null); // 等待转换完成 trans.waitUntilFinished(); // 获取转换执行结果 Result result = trans.getResult(); // 处理转换执行结果 // ... } public void runJob(String jobPath) throws KettleException { // 加载作业 JobMeta jobMeta = new JobMeta(jobPath, null); // 创建作业 Job job = new Job(null, jobMeta); // 执行作业 job.start(); // 等待作业完成 job.waitUntilFinished(); // 获取作业执行结果 Result result = job.getResult(); // 处理作业执行结果 // ... } } ``` 4. 在你的业务代码中,可以通过注入KettleService来使用Kettle的功能。例如: ```java @RestController public class MyController { @Autowired private KettleService kettleService; @GetMapping("/runTransformation") public String runTransformation() throws KettleException { String transformationPath = "path/to/your/transformation.ktr"; kettleService.runTransformation(transformationPath); return "Transformation executed successfully."; } @GetMapping("/runJob") public String runJob() throws KettleException { String jobPath = "path/to/your/job.kjb"; kettleService.runJob(jobPath); return "Job executed successfully."; } } ``` 以上是一个简单的示例,你可以根据你的具体需求进行相应的配置和调整。希望对你有帮助!如有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值