由于近期项目中需要对接收到文件进行解析,然后存入到数据库中,由于数据量较大,加之最近接触到了kettle,所以就想在项目中来实际使用下。
先编辑好kettle
文件
这里进行转换的功能比较简单,就是从文件中获取数据,然后进行分割,然后存放到数据库中。如下图所示,是最终的kettle
文件。
Java
中调用Kettle
来执行这个转换
添加依赖
这里使用的gradle
,需要注意的是maven
仓库的地址,在阿里的仓库貌似没找到kettle
的包,配置如下:
ext {
kettleVersion = '8.0.0.0-1'
}
repositories {
mavenLocal()
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url 'http://nexus.pentaho.org/content/groups/omni' }
}
dependencies {
compile("pentaho-kettle:kettle-core:${kettleVersion}")
compile("pentaho-kettle:kettle-engine:${kettleVersion}")
}
一些问题
- 由于这个转换在执行的时候,有些参数是要通过业务系统中获取到然后传入到这里来的,所以需要考虑这些参数怎么进行传递。
- 数据库的配置也是要通过配置文件中获取的,不能写死。
问题解决
针对第一个问题,kettle
可以设置命名参数,然后在执行的时候指定这些参数就可以。
针对第二个问题,在执行转换的时候设置数据库的相关配置就可以。
开始转换
设置命名参数
获取到metaData
后,然后进行设置就可以,具体代码如下:
TransMeta transMeta = new TransMeta(filename);
Map<String, String> params = new HashMap<String, String>() {{
put("filePath", filename);
put("tableName", tableName);
put("version", String.valueOf(version.getVersion()));
}};
params.forEach((k, v) -> {
try {
transMeta.setParameterValue(k, v);
} catch (UnknownParamException e) {
e.printStackTrace();
}
});
设置数据库配置
在设置数据库的配置的时候需要注意密码的加密方式,具体代码如下:
private static final String SEED = "0933910847463829827159347601486730416058";
private static final String PASSWORD_ENCRYPTED_PREFIX = "Encrypted ";
private String getPassword(String dbPass) {
BigInteger bi_passwd = new BigInteger(dbPass.getBytes());
BigInteger bi_r0 = new BigInteger(SEED);
BigInteger bi_r1 = bi_r0.xor(bi_passwd);
return PASSWORD_ENCRYPTED_PREFIX + bi_r1.toString(RADIX);
}
开始转换代码
KettleEnvironment.init(); // 初始化kettle环境
String filename = ResourceUtils.getFile("classpath:etc.ktr").getAbsolutePath();
TransMeta transMeta = new TransMeta(filename);
List<DatabaseMeta> dbList = transMeta.getDatabases();
// TODO 修改数据库信息
// TODO 设置参数
Trans trans = new Trans(transMeta);
// 设置日志等级
trans.setLogLevel(LogLevel.ERROR);
trans.execute(null);
trans.waitUntilFinished();