最近使用kettle做数据迁移工作:
在网上搜索找到两种方法:
1,利用kettle自带功能,向导中【多表复制向导】,选择要迁移的表后会生成一个job和n多个transformation,然后执行该job即可完成数据的迁移。该方法操作简单,选择要迁移的表也很方便,但总感觉,有点像二傻子似的。好歹能够解决一些问题
2,这个方法就牛x了,是从网上找到的一个实例,非常佩服作者值得大家学习。
a,主流程job
b,获取表名称
c,子job表数据抽取
d,将表名称设置成公共变量
e,在目标库中建表
f,开始数据迁移
这里详细说一下在目标库中建表,这是创建表结构的代码
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
// First, get a row from the default input hop
//
Object[] r = getRow();
org.pentaho.di.core.database.DatabaseMeta dbmeta = null;
java.util.List list = getTrans().getRepository().readDatabases();
if(list != null && !list.isEmpty())
{
for(int i=0;i<list.size();i++)
{
dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);
if("mysql_test".equalsIgnoreCase(dbmeta.getName()))
{
break;
}
}
}
if(dbmeta!=null)
{
org.pentaho.di.core.database.Database db=new org.pentaho.di.core.database.Database(dbmeta);
try
{
db.connect();
String tablename = getVariable("TABLENAME");
logBasic("开始创建表:" + tablename);
if(tablename!=null && tablename.trim().length()>0)
{
String sql = db.getDDL(tablename, data.inputRowMeta);//${TABLENAME}
//data变量是在UserDefinedJavaClass这个类中的一个成员变量,在创建该类时已经赋好值
db.execStatement(sql.replace(";", ""));
logBasic(sql);
}
}
catch(Exception e)
{
logError("创建表出现异常",e);
}finally{
db.disconnect();
}
}
return false;
}
以上这段代码是在自定义java类这个组件中写的。UserDefinedJavaClass源码如下:
希望该文章可以对大家有所帮助。
第二种方式实现下载地址:点击打开链接