1. 插入/更新
按照官方资料说明,插入/更新实现的功能只有两个:
- 依据查询关键字段,将未被发现的行记录插入到表中。
- 如果行记录在表中被找到,则比较需更新的字段,若更新字段不一致,则进行更新操作。
- 插入\更新操作并不要求数据流里的字段及字段名称与目标表中的字段及字段名称一致,只需要自定义好映射条件即可。
在MySQL中构建两个表personal_a和personal_b,其创建语句及原始数据如下。
create table `personal_a` (
`id` varchar (60),
`surname` varchar (60),
`name` varchar (60),
`age` int (10),
`sex` varchar (60)
);
insert into `personal_a` (`id`, `surname`, `name`, `age`, `sex`) values('p001','张','三','18','male');
insert into `personal_a` (`id`, `surname`, `name`, `age`, `sex`) values('p002','李','四','19','female');
insert into `personal_a` (`id`, `surname`, `name`, `age`, `sex`) values('p003','王','五','18','female');
insert into `personal_a` (`id`, `surname`, `name`, `age`, `sex`) values('p004','赵','六','20','female');
insert into `personal_a` (`id`, `surname`, `name`, `age`, `sex`) values('p005','孙','七','19','male');
insert into `personal_a` (`id`, `surname`, `name`, `age`, `sex`) values('p006','周','八','21','female');
insert into `personal_a` (`id`, `surname`, `name`, `age`, `sex`) values('p007','吴','九','20','male');
create table `personal_b` (
`id_b` varchar (30),
`username` varchar (60),
`age` int (10),
`sex` varchar (30)
);
先从【文件】—>【新建】—>【数据库连接】创建好接下来要用到的数据库连接。具体如下:
创建如下转换任务:
(1)配置 表输入。 点击【获取SQL查询语句】,找到对应的表,点击【确定】即可。然后会有一个弹出窗口提示是否需要展示字段名,点击【是】或【否】都可以。
(2)配置 插入\更新 实现插入功能。
- 目标表:数据将要插入的表。点击【浏览】找到对应表名即可。
- 用来查询的关键字段:这一部分用来设置查询的关键字段。表字段指示的是目标表的中的字段,流里的字段指示的是的转换的上一步操作传入的字段。比较符指定匹配方法。
- 更新字段: 指定字段对应规则。上图在【映射匹配】中的【映射】框里指定了输入流中的字段与目标表中的字段对应规则。如果目标表中的某些字段没有指定输入流中的对应字段,则目标表中对应字段为NULL。
进行转换任务时,输入流中的指定字段和目标表中的指定字段进行比较操作,如果满足条件比较条件,并且输入流和目标表中的更新字段完全一致,则该条记录不会写入到目标表中,如果满足比较条件但对应的更新字段不一致,则对目标表中的数据进行更新。如果目标表中没有该条记录,则将输入流中的记录插入到目标表中。
设置完以后,运行转换作业。然后到mysql中查看personal_b。具体如下:
(3)更改 插入/更新配置。对personal_b中的username字段进行更新。将username的映射字段从surname更改为name。
重新运行转换作业,并查看personal_b表,其结果如下:
参考资料:https://wiki.pentaho.com/display/EAI/Insert+-+Update (或者插入/更新编辑左下角【Help】也可以进入该页面)。
2. 表输出
表输出类似于SQL中的insert功能。当相同的转换任务运行多次时,输入流中的数据会多次写入到目标表中。仍然以上述两个表为例。将personal_b中的数据清空。创建如下转换任务(表输入的设置与前文相同)、
对 表输出 进行设置,具体如下:
然后运行该转换作业,然后到mysql中查看一下personal_b,如下:
对上述表输出设置进行更改,如下:
重新运行转换任务之后,personal_b中的数据如下:
可以看到,两次转换任务的数据叠加到了一起。
3. 表输入
前面已经涉及到了表输入基本用法,这里重点讲一下表输入怎么接收参数?假如我们在表输入阶段筛选出sex='male'的数据,可以创建如下转换:
配置【自定义常量数据】,具体如下:
配置【表输入】,具体如下:
运行改转换,最后得到的数据如下:
注意:从【自定义常量数据】中设定的常量的字段的名称可以和表输入中where子句需要用到的字段的名称可以不一致,但是字段的数量及位置必须一致。
如果前述步骤传入【表输入】中的某个参数的值不止一个,如下:
此时,需要在【表输入】的配置选项中勾选【执行每一句】,否则会报错。具体如下:
此时,执行结果如下: