第六章——数据转换(案例三:数据粒度的转换)

1.数据准备

在MySQL中输入以下代码:

create table `company` (
	`id` int (30),
	`salesArea` varchar (150),
	`brand` varchar (150),
	`model` varchar (150),
	`unitPrice` varchar (150),
	`number` int (30)
); 
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('1','北京市','华为','华为nova 5 Pro(8GB/128GB/全网通)','2999','31');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('2','北京市','苹果','苹果iPhone 11 Pro(6GB/64GB/全网通)','8699','50');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('3','上海市','苹果','苹果iPhone 11 Pro(6GB/256GB/全网通)','9999','20');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('4','山西省','苹果','苹果iPhone 11(4GB/64GB/全网通)','5499','20');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('5','河北省','OPPO','OPPO Reno2(8GB/128GB/全网通)','2999','27');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('6','北京市','三星','三星GALAXY Note 10+(12GB/256GB/全网通/5G版)','7999','32');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('7','石家庄市','OPPO','OPPO Reno2(8GB/128GB/全网通)','2999','20');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('8','黑龙江省','华为','华为Mate30(8GB/128GB/全网通/5G版/玻璃版)','4999','34');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('9','陕西省','vivo','vivo iQOO Pro(8GB/128GB/5G全网通)','3798','38');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('10','大连市','OPPO','OPPO Reno 10倍变焦版(8GB/256GB/全网通)','4299','35');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('11','秦皇岛市','vivo','vivo NEX 3(8GB/256GB/全网通/5G版)','5698','26');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('12','北京市','vivo','vivo NEX 3(8GB/128GB/全网通)','4998','26');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('13','天津市','苹果','苹果iPhone 11 Pro Max(6GB/64GB/全网通)','9599','18');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('14','青岛市','vivo','vivo iQOO Pro(8GB/128GB/5G全网通)','3798','25');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('15','西安市','华为','华为P30 Pro(8GB/128GB/全网通)','4988','30');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('16','重庆市','小米','小米9(8GB/256GB/全网通)','2999','26');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('17','四川省','苹果','苹果iPhone 11 Pro Max(6GB/64GB/全网通)','9599','35');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('18','大同市','小米','小米9 Pro(8GB/256GB/全网通/5G版)','3799','22');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('19','重庆市','苹果','苹果iPhone 11 Pro Max(6GB/64GB/全网通)','9599','38');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('20','陕西省','小米','小米9 Pro(8GB/256GB/全网通/5G版)','3799','39');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('21','上海市','华为','华为Mate 20 X(8GB/256GB/全网通/5G版)','6199','42');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('22','哈尔滨市','OPPO','OPPO R17(8GB RAM/全网通)','2499','29');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('23','深圳市','苹果','苹果iPhone 11 Pro Max(6GB/64GB/全网通)','9599','36');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('24','北京市','三星','三星Galaxy S10+(8GB RAM/陶瓷版/全网通)','7499','27');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('25','河北省','苹果','苹果iPhone 11(4GB/128GB/全网通)','5999','20');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('26','西安市','苹果','苹果iPhone 11 Pro(6GB/256GB/全网通)','9999','15');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('27','太原市','华为','华为P30 Pro(8GB/128GB/全网通)','4988','24');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('28','浙江省','苹果','苹果iPhone 11(4GB/256GB/全网通)','6799','29');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('29','天津市','小米','小米9 Pro(8GB/256GB/全网通/5G版)','3799','35');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('30','天津市','三星','三星GALAXY Note 10(8GB/256GB/全网通)','6599','23');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('31','武汉市','小米','小米9(8GB/256GB/全网通)','2999','37');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('32','上海市','华为','华为Mate30(8GB/128GB/全网通/5G版/玻璃版)','4999','30');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('33','重庆市','苹果','苹果iPhone 11(4GB/64GB/全网通)','5499','38');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('34','秦皇岛市','vivo','vivo X27 Pro(8GB RAM/全网通)','3598','33');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('35','大连市','苹果','苹果iPhone 11 Pro(6GB/64GB/全网通)','8699','18');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('36','山东省','华为','华为Mate30 Pro(8GB/128GB/全网通)','5799','20');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('37','陕西省','小米','小米MIX 3(6GB RAM/全网通)','2299','33');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('38','上海市','华为','华为Mate30(8GB/128GB/全网通/5G版/玻璃版)','4999','42');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('39','北京市','华为','华为Mate30 Pro(8GB/256GB/全网通/5G版/玻璃版)','6899','35');
insert into `company` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('40','山西省','华为','华为Mate30 Pro(8GB/256GB/全网通/5G版/玻璃版)','6899','20');

 2.打开Kettle工具,创建转换

使用Kettle工具,创建一个转换granularity,并添加表输入控件、字段选择控件、排序记录控件、记录集连接控件、过滤控件、空操作控件、表输出控件以及Hop跳连接线,具体如图所示。

 3.配置表输入控件

单击新建按钮,配置数据库连接,配置完成后单击确认按钮。MySQL数据库连接的配置,具体如图所示。

 SQL框中编写获取数据表company中所有数据的SQL语句,然后单击预览按钮,查看数据表company中数据是否成功从MySQL数据库中抽取到表输入流中,具体如图所示。

4. 配置字段选择控件

双击“字段选择”控件,进入“选择/改名值”界面,在“选择和修改”选项卡的“字段”处手动添加所需字段,这里添加字段idsalesArea,具体如图所示。

5. 配置排序记录控件

双击“排序记录”控件,进入“排序记录”配置界面,在“字段”框中添加字段salesArea,通过以该字段为基础对整体数据进行升序排序,具体如图所示。

6. 配置表输入2控件

单击新建按钮,配置数据库连接,配置完成后单击确认按钮。MySQL数据库连接的配置,具体如图所示。

 SQL框中编写SQL语句,用于查询city数据表中字段citypid的数据,用于与数据表company中字段salesArea进行合并连接;单击预览按钮,查看city数据表中的字段citypid的数据是否成功从MySQL数据库中抽取到表输入流中,具体如图所示。

 

7. 配置排序记录2控件

双击“排序记录2”控件,进入“排序记录”配置界面,并在“字段”框中添加字段city,以该字段为基础对整体数据进行升序排序,具体如图所示。

8. 配置记录集连接控件

双击“记录集连接”控件,进入“合并排序”配置界面,并在“第一个步骤”处的下拉框中选择“排序记录”控件,“第二个步骤”处的下拉框中选择“排序记录2”控件;在“第一个步骤的连接字段”和“第二个步骤的连接字段”处分别添加连接字段,这里添加的连接字段是salesAreacity,将“排序记录”控件流中的数据与“排序记录2”控件流中的数据进行合并连接;在“连接类型”处的下拉框选择连接类型,这里选择的LEFT OUTER,即左外连接,具体如图所示。

9. 配置字段选择2控件

双击“字段选择2”控件,进入“选择/改名值”界面,并在“选择和修改”选项卡的“字段”处手动添加所需字段,这里添加字段idpidsalesArea,具体如图所示。

10. 配置排序记录3控件

双击“排序记录3”控件,进入“排序记录”配置界面,在“字段”框中添加字段pid,以该字段为基础对整体数据进行升序排序,具体如图所示。

 11.配置表输入3控件

单击新建按钮,配置数据库连接,配置完成后单击确认按钮。MySQL数据库连接的配置,具体如图所示。

 SQL框中编写SQL,用于获取数据表provincial中字段为idProvincial的数据,后续用于与“排序记录”控件流中的字段数据进行合并连接,然后单击预览按钮,查看数据表provincial中字段为idProvincial的数据是否成功从MySQL数据库中抽取到表输入流中,具体如图所示。

12. 配置排序记录4控件

双击“排序记录4”控件,进入“排序记录”配置界面,并在“字段”框中添加字段pid,以该字段为基础对整体数据进行升序排序,具体如图所示。

 13.配置记录集连接2控件

双击“记录集连接2”控件,进入“合并排序”配置界面,并在“第一个步骤”处的下拉框中选择“排序记录3”控件,“第二个步骤”处的下拉框中选择“排序记录4”控件;在“第一个步骤的连接字段”和“第二个步骤的连接字段”处分别添加连接字段,这里分别添加的连接字段是pidpid;在“连接类型”处的下拉框选择连接类型,这里选择的LEFT OUTER,即左外连接,在“字段”框中添加字段pid,以该字段为基础对整体数据进行升序排序,具体如图所示。

 13.配置过滤记录控件

双击“过滤记录”控件,进入“过滤记录”配置界面;在“条件”处设置过滤的条件,将字段为Provincial中值为“null”的数据过滤掉;在“发送true数据给步骤:”处的下拉框中选择“空操作”,将Provincial字段值为不为null的数据放在“空操作”控件中;在“发送false数据给步骤:”处的下拉框中选择“空操作(什么也不做)2”,将Provincial字段值为null的数据放在“空操作(什么也不做)2”控件中,具体如图所示

14. 配置字段选择3控件

双击“字段选择3”控件,进入“选择/改名值”界面;在“选择和修改”选项卡的“字段”处手动添加所需字段,这里添加字段idProvincial,用于后续进行输出,具体如图所示。

15. 配置表输出控件

双击“表输出”控件,进入“表输出”控件的配置界面;单击新建按钮,配置数据库连接,配置完成后单击确认按钮。数据库连接的配置,具体如图所示。

 单击目标表右侧的浏览按钮,指定输出目标表,即数据表temporary;勾选“指定数据库字段”复选框,用于将数据表temporary的字段与字段选择3控件输出流中的字段进行匹配,具体如图所示。

依次选中“源字段”选项框的字段和“目标字段”选项框对应的字段,再单击【Add】按钮,将一对映射字段添加至“映射”选项框中,若“源字段”选项框的字段和“目标字段”选项框的字段相同,则可以单击猜一猜按钮,让Kettle自动实现映射;单击确定按钮,完成“源字段”与“目标字段”的映射匹配。“表输出”界面最终的配置如图所示。

17. 配置字段选择4控件

双击“字段选择4”控件,进入“选择/改名值”界面,并在“选择和修改”选项卡的“字段”处手动添加所需字段,这里添加字段idsalesArea,用于后续进行输出,具体如图所示。

18. 配置表输出2控件

双击“表输出2”控件,进入“表输出”控件的配置界面,单击新建按钮,配置数据库连接,配置完成后单击确认按钮。数据库连接的配置具体如图所示。

 单击目标表右侧的浏览按钮,指定输出目标表,即数据表temporary;勾选“指定数据库字段”复选框,用于将数据表temporary的字段与字段选择4控件输出流中的字段进行匹配;单击“数据库字段”选项卡,具体如图所示。

 单击输入字段映射按钮,弹出“映射匹配”对话框,依次选中“源字段”选项框的字段和“目标字段”选项框对应的字段,再单击【Add】按钮,将一对映射字段添加至“映射”选项框中,若“源字段”选项框的字段和“目标字段”选项框的字段相同,则可以单击猜一猜按钮,让Kettle自动实现映射,具体如图所示。

19.打开Kettle工具,新建转换

20. 配置表输入控件

双击步骤19的“表输入”控件,进入“表输入”界面,单击新建按钮,配置数据库连接,配置完成后单击确认按钮。MySQL数据库连接的配置,具体如图所示。

 SQL框中编写获取数据表temporary中字段idsalesArea的数据的 SQL语句,然后单击预览按钮,查看数据表temporary中数据是否成功从MySQL数据库中抽取到表输入流中,如图所示。

 ​

 21.配置字段选择控件

双击步骤19中的“字段选择”控件,进入“选择/改名值”界面,并在“选择和修改”选项卡的“字段”处手动添加所需字段,这里添加字段idsalesArea,后续用于与数据表company中的数据进行合并,“选择和修改”选项卡的配置如图所示。

 22.配置排序记录控件

双击步骤19中的“排序记录”控件,进入“排序记录”配置界面,并在“字段”框中添加字段id,以此字段为基础对所有数据进行升序排序,如图所示。

23. 配置表输入2控件

双击步骤19中的“表输入2”控件,进入“表输入”配置界面,单击新建按钮,配置数据库连接,配置完成后单击确认按钮。MySQL数据库连接的配置,具体如图所示。

 SQL框中编写SQL语句,用于查询数据表company中的全部数据,然后单击预览按钮,查看数据表company中的数据是否成功从MySQL数据库中抽取到表输入流中,如图所示。

 

24 配置字段选择2控件

双击步骤19中的“字段选择2”控件,进入“选择/改名值”界面,并在“选择和修改”选项卡的“字段”处手动添加所需字段,这里添加字段idbrandmodelunitPricenumber,后续通过字段id将数据表temporary中字段salesArea和数据表company中的数据进行合并,“选择和修改”选项卡的配置如图所示。

 25.配置排序记录2控件

双击步骤19中的“排序记录2”控件,进入“排序记录”配置界面,并在“字段”框中添加字段id,以此字段为基础对全部数据进行升序排序,具体如图所示。

 26.配置记录集连接控件

双击步骤18中的“记录集连接控件,进入“合并排序”配置界面,并在“第一个步骤”处的下拉框中选择“排序记录”,“第二个步骤”处的下拉框中选择“排序记录2”;在“第一个步骤的连接字段”和“第二个步骤的连接字段”处添加连接字段,这里添加的连接字段是idid,用于将“排序记录”控件流中的数据与“排序记录2”控件中的数据合并连接;在“连接类型”处的下拉框选择连接类型,这里选择的FULL OUTER,即完全外连接,具体如图所示。

27. 配置字段选择3控件

双击步骤19中的“字段选择3”控件,进入“选择/改名”配置界面,并在“选择和修改”选项卡的“字段”处手动添加所需字段,由于源数据表company中包含字段idsalesAreabrandmodelunitPricenumber,因此需要获取“记录集连接”控件流中的字段idsalesAreabrandmodelunitPricenumber,用于与源数据表company中的字段相对应,具体如图所示。

27. 配置表输出控件

双击步骤18中的“表输出控件,进入“表输出”配置界面,单击新建按钮,配置数据库连接,配置完成后单击确认按钮。数据库连接的配置,具体如图所示。

 单击目标表右侧的浏览按钮,指定输出目标表,即数据表company_new;勾选“指定数据库字段”复选框,用于将数据表temporary的字段与字段选择3控件输出流中的字段进行匹配;单击“数据库字段”选项卡,具体如图所示。

单击输入字段映射按钮,弹出“映射匹配”对话框;依次选中“源字段”选项框的字段和“目标字段”选项框对应的字段,再单击【Add】按钮,将一对映射字段添加至“映射”选项框中,若“源字段”选项框的字段和“目标字段”选项框的字段相同,则可以单击猜一猜按钮,让Kettle自动实现映射,具体如图所示。

 

28.打开Kettle工具,新建作业

29.配置Start控件

双击步骤28中的“Start”控件,进入“作业定时调度”界面,该控件中可以设置时间调度以执行作业,这里使用默认配置,不作修改。单击确定按钮,完成Start控件的配置,具体如图所示。

30 .配置转换控件

双击步骤28中的“转换控件,进入“转换”配置界面,单击浏览按钮,选择添加转换granularity至作业中,具体如图所示。

31. 配置转换2控件

双击步骤28中的“转换2”控件,进入“转换”配置界面,单击浏览按钮,选择添加转换granularity_merge至作业中,具体如图所示。

32. 运行作业成功后结果如下

 33查看数据表company_new中的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值