soopn用一张表更新另一张表_KETTLE实现数据的删除和更新

使用Kettle实现Oracle数据库到MongoDB的数据同步,包括根据触发器记录执行删除和更新操作。通过JAVA代码组件判断是删除还是更新,然后分别跳转到对应的MongoDB Delete或字段选择步骤,最终实现数据的精确同步。
摘要由CSDN通过智能技术生成

一、实现目标

源数据库的数据更新或者删除之后,目标数据库的数据跟着更新或删除,整体流程截图如下:

一、准备工作

源数据库ORACLE  目标数据库MongoDB,在源数据库添加删除、更新触发器

二、操作步骤

添加表输入组件,连接ORACLE触发器记录表

添加JAVA代码组件,进行步骤跳转,根据输入的数据判断是删除或者更新,如果是删除,则跳转至MongoDB Delete步骤中,如果是更新的话,跳转至字段选择步骤中。JAVA代码中的详细信息如下:

importjava.util.List;importorg.pentaho.di.core.exception.KettleException;importorg.pentaho.di.core.row.RowDataUtil;importorg.pentaho.di.core.row.RowMeta;importorg.pentaho.di.core.row.RowMetaInterface;importorg.pentaho.di.core.row.ValueMeta;importorg.pentaho.di.trans.Trans;importorg.pentaho.di.trans.TransMeta;private Object[] previousRow;//上一行

private RowSet t1 = null;//业务表步骤

private RowSet t2 = null;//删除步骤

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throwsKettleException

{

Object[] r= getRow(); //获取输入行

if( first ) {if ( getInputRowMeta() == null) {

setOutputDone();//设置输出完成

return false;

}

}if ( r == null ) { //如果当前行为null

if ( previousRow != null ) {//如果上一行不为null//是最后一行

boolean valid=true;

previousRow=createOutputRow(previousRow, data.outputRowMeta.size());

Trans trans=getTrans();//获取转换实例

if (trans != null){

String sync_val= get(Fields.In, "ID").getString(previousRow);//获取ID

trans.setVariable("LAST_SYNC_VAL", sync_val);//设置变量的值

}

String OpType= get(Fields.In, "DATATYPE").getString(previousRow);//获取操作类型是删除还是更新

String keyid= get(Fields.In, "DATAID").getString(previousRow);//获取操作类型是删除还是更新//Object[] rowData = RowDataUtil.allocateRowData(data.outputRowMeta.size());//get(Fields.Out, "KEYID").setValue(rowData,keyid);//putRowTo(data.outputRowMeta, previousRow,t2);

if(OpType.equals("UPDATE")){//验证通过

putRowTo(data.outputRowMeta, previousRow,t1);

}else{

putRowTo(data.outputRowMeta, previousRow,t2);

}

}

setOutputDone();//设置输出完成

return false;//返回false表示不用再继续处理processRow

}if ( !first ) {//不是第一次执行,因为第一次执行时previousRow一定是Null//不是最后一行

boolean valid=true;

String OpType= get(Fields.In, "DATATYPE").getString(previousRow);//获取操作类型是删除还是更新

String keyid= get(Fields.In, "DATAID").getString(previousRow);//获取操作类型是删除还是更新//Object[] rowData = RowDataUtil.allocateRowData(data.outputRowMeta.size());//get(Fields.Out, "KEYID").setValue(rowData,keyid);//putRowTo(data.outputRowMeta, previousRow,t2);

if(OpType.equals("UPDATE")){

putRowTo(data.outputRowMeta, previousRow,t1);

}else{

putRowTo(data.outputRowMeta, previousRow,t2);

}

}

previousRow= r;//把当前行设为下一次执行的上一行

if ( first ) {//如果是首次执行

first = false;

t1= findTargetRowSet("dataupdate");//业务表步骤

t2 = findTargetRowSet("datadelete");//数据删除步骤

}return true;//返回true表示还要继续处理processRow

}

3.如果跳转至了MongoDB Delete,则根据ID对目标库进行删除。Mongodb delete组件配置如下:

JSON query中的{ID:"?{DATAID}"}表示删除ID等于传进来的参数DATAID的所有数据,Execute for each row要选择上,表示执行每一行数据。

4.如果通过JAVA代码2判断为更新的话,则流程将跳转至字段选择组件,只获取主键ID,此步骤非常重要,因为要根据ID去源表中获取等更新的那条数据。

5.选择表输入组件,该步骤是根据上一步传入的ID获取待更新的那一条数据

PS:获取SQL查询语句:此处写入SQL语句,里边的?是变量替换,下边要勾选上"替换SQL语句里的变量",从步骤插入数据要选择上一步,勾选上执行每一行。

6.下边的步骤:流查询、JAVA代码是对数据进行清洗,字典替换,此处不再解释

7.最后一步:Mongodb output输出需要详细设置

output options选项卡勾选update  modifier update

Mongo文档字段配置:ID为主键匹配字段,匹配字段更新为Y 修改器设置为N/A表示不对主键更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值