使用kettle做数据抽取的时候可以使用图形化的工具配置日志保存参数,选择数据库连接,输入日志表名称,
点击sql 执行对应的sql创建日志表即可。
点击保存之后,日志配置会保存在trans或者job的配置文件中。这样当使用api调取trans或者job配置文件进行数据抽取的时候就会自动把转换日志存储到配置的数据表中。
然而在实际应用中这意味着工作量增大。所以我们的想法是创建固定的表,在执行转换的过程中自动配置日志保存路径。
这里以trans为例,job类似。
代码:
初始化DatabaseMate:
private String name;
private String type;
private String access;
private String hostname;
private String DBName;
private String DBPort;
private String username;
private String password;
private String servername; DatabaseMeta databaseMeta = new DatabaseMeta(name, type, access, hostname, DBName, DBPort, username, password);
初始化Trans
TransMeta transMeta = new TransMeta("L:\\ETL\\ceshi\\1.ktr");
Trans trans = new Trans(transMeta);
给Trans添加数据源
--添加到元数据上
transMeta.addDatabase(etlLogDatabaseMeta);
设置channellogtable
VariableSpace space = new Variables();
//将step日志数据库配置名加入到变量集中
space.setVariable("kettle_log","logdb");
space.initializeVariablesFrom(null); ChannelLogTable channelLogTable = ChannelLogTable.getDefault(space, transMeta);
channelLogTable.setConnectionName("logdb");
channelLogTable.setTableName("log_trans_channel");
transMeta.setChannelLogTable(channelLogTable);
执行trans
trans.execute(null); // You can pass arguments instead of null.
trans.waitUntilFinished();
if (trans.getErrors() > 0) {
throw new RuntimeException(
"There were errors during transformation execution.");
}
这样就可以保存到指定表中了。
当然做这些事情之前要
KettleEnvironment.init();