不得不说顶级大佬们都有一种理工的终极浪漫,yugong这个名字真的太贴切了Orz,哈哈哈哈
首先附上项目Github源地址:点击进入
项目官方文档:点击进入
下载地址:点击进入
(建议直接下载tar包,不建议自己编译,会遇到各种问题,需要改源码的大佬当我没说)
强烈建议先去把人家的文档好好看一遍,其实他的文档已经写的非常清楚了,愚公的使用相对简单,这里主要介绍一下yugong的几个模式的问题,以及在使用过程中的问题。
这个是前提条件,所以放在第一个讲
如果表没有主键,是没有办法进行增量更新的!(增量模式INC)
这一点是必须要注意的,如果一定需要增量同步这里只有一个解决办法,就是给表加一个主键。如果表不是很大的话就每天全量把。
全量模式(FULL):遍历源表所有的数据后,插入目标表,需要注意的是如果目标表有主键是不支持断点续传的,也就是说全量同步如果在中途意外终止,是不能够直接再次运行的,需要清空目标表之后再运行,因为会引发主键冲突。
增量模式(INC):同步方案的主要模式,在表规模变大时采用增量模式会极大的节省时间和减轻数据库压力。需要注意的是增量模式需要源表一定要有主键,而且需要源数据库有该表的物化日志表。物化日志并不是必须的,没有物化日志也能够正常运行增量模式,但是如果源表的字段发生变化并不会同步,这点尤其重要。
自动模式(ALL):首先进行全量模式,全量完成之后自动切换为增量模式
MARK模式(MARK):愚公自带的创建物化视图的模式,运行此模式会给指定的表自动创建物化视图,需要注意的是操作的表也必须要有主键才会创建成功。
CLEAR模式(CLEAR):自动删除创建的物化视图
对比模式(CHECK):当数据量极大时我们并不能知道两个数据库是否完全一致,对比模式可以便利两个数据库,查看是否一致。需要注意的是当数据表特别大时(百万数量级),运行会报游标错误,这个应该是数据库的设置问题,这个问题目前没有解决(我们并没有修改顶级数据库的权限)
这个是yugong中的重点了,因为它是最常用的模式,在数据量非常大的时候不可能每天进行全量同步,这样对于数据库的压力太大。
package com.taobao.yugong.translator;
import java.sql.Types;
import java.util.Date;
import org.apache.commons.lang.ObjectUtils;
import com.taobao.yugong.common.db.meta.ColumnMeta;
import com.taobao.yugong.common.db.meta.ColumnValue;
import com.taobao.yugong.common.model.record.Record;
public class AcdFileDataTranslator extends AbstractDataTranslator implements DataTranslator {
public boolean translator(Record record) {
//拿出源表的四个字段值
ColumnValue qsrs = record.getColumnByName("qsrs");
ColumnValue zjccss = record.getColumnByName("zjccss");
ColumnValue zsrs = record.getColumnByName("zsrs");
ColumnValue swrs = record.getColumnByName("swrs30");
StringBuilder displayNameValue = new StringBuilder(64);
//计算程度
displayNameValue.append(ObjectUtils.toString(
addOf(
ObjectUtils.toString(qsrs.getValue())
,ObjectUtils.toString(zjccss.getValue())
,ObjectUtils.toString(zsrs.getValue())
,ObjectUtils.toString(swrs.getValue()))));
//定义一个新字段,赋予字段名称,类型
ColumnMeta gmtMoveMeta = new ColumnMeta("sgyzcd", Types.VARCHAR);
//赋值
ColumnValue gmtMoveColumn = new ColumnValue(gmtMoveMeta ,displayNameValue.toString());
record.addColumn(gmtMoveColumn);
return super.translator(record);
}
public String addOf(String qsr, String zjccs, String zsr, String swr){
if(qsr==null || qsr=="" || zjccs==null || zjccs=="" || zsr==null || zsr=="" || swr==null || swr=="") {
return "0";
}
int qsrs = Integer.parseInt(qsr);
int zjccss = Integer.parseInt(zjccs)/10000;
int zsrs = Integer.parseInt(zsr);
int swrs = Integer.parseInt(swr);
String a = "0";
if((qsrs>0 && qsrs<=2) || zjccss<0.12){
a = "1";
}
if((zsrs>=1 && zsrs<=2) || qsrs>=3 || zjccss<3){
a = "2";
}
if((swrs>=1 && swrs<=2) || (zsrs>=3 && zsrs<=10) || (zjccss>=3 && zjccss<6)){
a = "3";
}
if(swrs>=3 || zsrs>10 || (swrs==1 && zsrs>=8) || (swrs==2 && zsrs>=5) || zjccss>=6){
a = "4";
}
return a;
}
}
就是一个利用原表的四个字段来判断事故的严重程度,非常简单的一个需求。