Kettle
启动:双击spoon.bat
参数配置
在使用Kettle之前,可以根据自己电脑的配置对kettle进行参数配置,将会极大提高Kettle的执行效率
内存配置
在kettle安装目录下找到启动文件Spoon.bat,右键编辑,在文件中查找PENTAHO_DI_JAVA_OPTIONS
# 默认值
if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xms1024m" "-Xmx2048m" "-XX:MaxPermSize=256m"
# 修改值(根据自己电脑配置修改)
"%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS= "-Xmx4096m" "-XX:MaxPermSize=4096m"
# 参数详解
# "-Xms4096m":配置java虚拟机堆区内存初始内存分配的大小 未配置
# "-Xmx4096m":配置java虚拟机堆区内存可被分配的最大上限
# "-XX:MaxPermSize=4096m":配置java对非堆区分配的内存的最大上限
数据库连接配置
在进行数据读和写操作的时候,可以对数据库连接进行配置,可以让数据库操作效率更高
命名参数 | 值 | 参数说明 |
useCompression | true | 在传输时开启数据压缩 ,提高传输效率 |
rewriteBatchedStatements | true | 让数据库重排Insert语句,合并多条插入语句成为一条,提交插入效率 |
useServerPrepStmts | false | 让数据库重排Insert语句,合并多条插入语句成为一条,提交插入效率 |
转换
Concat fields
字段拼接,如:将lastName与firtName拼接返回
值映射
可以将源字段中使用到的枚举值映射为value,如:数据库中性别存储的为1,2输出显示为男,女
增加常量
在输出的结果中增加一列,固定值
增加序列
在输出的时候增加一列自增值,可设置自增步长
字段选择
可以删除不需要的字段或者将字段改名为自己想要的名称
计算器
可以计算数值
字符串操作
字符串剪切,对字符串进行剪切
字符串替换,可以使用正则表达式对字符串进行替换
字符串操作,可以去除字符串左右两边空格,转换大小写等
排序&去重
去重之前需要先进行排序
唯一行
对每一行创建一个哈希值,进行去重,效率更高
拆分字段
把字段按照分隔符拆分成两个或多个字段,需要注意,原字段会消失
列拆分为多行
将指定字段根据分隔符拆分为多行,其他字段复制,示例如下图:
行扁平化
列拆分为多行的逆向操作
前置条件:1、需要先排序;2、第个分组的数据条数要保持一致,如下图,每种数据条数都是3条
列转行
列转行 之前必须按照分组字段进行排序,实现效果:
行转列
列转行逆向操作
应用
替换NULL值
将数据中的Null值替换成其他值
写日志
主要是调试时使用,可以将数据流中每行数据打印到控制台
流程
Switch/case
利用一个字段的数据的不同值,让数据流从一路到多路,示例如下将相同部门的数据输出到相同的excel中,即,将以下一个excel输出到三个excel中
过滤记录
类似于if/else,可以根据条件将流程分为两步
空操作
什么都不做,一般作为数据流的终点,如上一步过滤记录中不满足条件的流程可以连接到空操作中
终止
如果数据流到这个控件,那么整个程序会终止并打印报错信息,一般用来校验数据,调试程序
查询控件
数据库查询
类似于mysql中的多表关联查询,使用kettle可以实现跨数据库关联查询
流查询
流查询是将两条数据流中的数据根据字段做等值匹配,流查询在查询前会把数据加载到内存中,只能做等值匹配
相较与数据库查询只能左连接,流查询可以选择以某个连接为主,也就是说可以实现右连接
使用方法如下:
连接控件
合并记录
比较两个数据流中数据的差异,比较结果有以下几种
1、identical 新旧数据一致
2、changed 数据发生了改变
3、new 旧数据没有, 新数据有
4、deleted 旧数据有,新数据没有
需要先对数据进行排序
记录集连接
可以对两个步骤中的数据进行左连接,右连接,内连接,外连接等,在使用连接之前需要先对数据进行排序,而且排序字段需要是两个表关联的字段
统计控件
分组
类似于Group By,分组前最好先进行排序,可以对数据进行分组,统计个数,计算平均值等操作
映射控件控件
映射
类似于Java中的方法,在转换中可以调用其他转换,映射输入规范类似于入参,映射输出规范类似于出参
使用映射实现数据库左连接:
脚本控件
执行sql脚本
选择数据库连接,填写自定义sql,可以根据之前的步骤获取的数据当做参数
Java代码
当一些需求Kettle自带组件不能满足时,可以使用自定义Java代码进行实现,如:当id大于100,则将名称改为100,如下图:
代码如下:
// 获取值
Integer id = Integer.valueOf(get(Fields.In,"id").getString(r));
String name = "";
if(id>100){
name = "100";
}
// 设置值
get(Fields.Out,"name").setValue(r,name);
作业
作业项之间连接状态:
小锁:无论上一个作业项执行结果如何,下一个任务都会执行
对号:只有上一个作业项结果为真,或者执行成功才会执行下一个任务
错号:只有上一个作业项执行结果为假,或者执行失败的时候,才会执行下一个任务