一、多数据合并
目录
1.准备数据
company_a.csv的数据内容
数据表company_b的数据内容
company_b创建与插入数据
create table `company_b` (
`id` int (30),
`salesArea` varchar (150),
`brand` varchar (150),
`model` varchar (150),
`unitPrice` int (50),
`number` int (30)
);
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('1','北京市','华为','华为nova 5 Pro(8GB/128GB/全网通)','2999','31');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('2','山西省','苹果','苹果iPhone 11(4GB/64GB/全网通)','5499','20');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('3','河北省','OPPO','OPPO Reno2(8GB/128GB/全网通)','2999','27');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('4','黑龙江省','华为','华为Mate30(8GB/128GB/全网通/5G版/玻璃版)','4999','34');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('5','陕西省','vivo','vivo iQOO Pro(8GB/128GB/5G全网通)','3798','38');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('6','北京市','vivo','vivo NEX 3(8GB/128GB/全网通)','4998','26');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('7','天津市','苹果','苹果iPhone 11 Pro Max(6GB/64GB/全网通)','9599','18');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('8','重庆市','小米','小米9(8GB/256GB/全网通)','2999','26');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('9','四川省','苹果','苹果iPhone 11 Pro Max(6GB/64GB/全网通)','9599','35');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('10','陕西省','小米','小米9 Pro(8GB/256GB/全网通/5G版)','3799','39');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('11','上海市','华为','华为Mate 20 X(8GB/256GB/全网通/5G版)','6199','42');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('12','北京市','三星','三星Galaxy S10+(8GB RAM/陶瓷版/全网通)','7499','27');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('13','河北省','苹果','苹果iPhone 11(4GB/128GB/全网通)','5999','20');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('14','浙江省','苹果','苹果iPhone 11(4GB/256GB/全网通)','6799','29');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('15','天津市','小米','小米9 Pro(8GB/256GB/全网通/5G版)','3799','35');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('16','上海市','华为','华为Mate30(8GB/128GB/全网通/5G版/玻璃版)','4999','30');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('17','重庆市','苹果','苹果iPhone 11(4GB/64GB/全网通)','5499','38');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('18','山东省','华为','华为Mate30 Pro(8GB/128GB/全网通)','5799','20');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('19','陕西省','小米','小米MIX 3(6GB RAM/全网通)','2299','33');
insert into `company_b` (`id`, `salesArea`, `brand`, `model`, `unitPrice`, `number`) values('20','山西省','华为','华为Mate30 Pro(8GB/256GB/全网通/5G版/玻璃版)','6899','20');
2.打开kettle工具创建转换
3.配置步骤
配置CSV文件输入控件,双击“CSV文件输入”控件,单击【浏览】按钮,选择要抽取的CSV文件company_a.csv;单击【获取字段】按钮,Kettle自动检索CSV文件获取字段名称,并对文件中字段的类型、格式、长度、精度等属性进行解析。
单击【浏览】按钮,查看文件company_a.csv的数据是否抽取到CSV文件输入流中
双击“字段选择”控件,在“选择和修改”选项卡的“字段”处手动添加CSV文件输入控件输出的所有数据字段,也可以单击【获取选择的字段】按钮,Kettle工具自动检索并添加CSV文件输入控件输出的所有数据字段。
选择“元数据”选项卡,切换到“元数据”选项卡界面。添加需要改变元数据的字段,将“字段选择”流中的字段进行一致性处理,在“Binary to Normal”一列的下拉框中,选择为“是”,使得CSV文件company_a.csv中数据的字段类型与数据表company_b中数据的字段类型一致。
双击“表输入”控件,单击【新建】按钮,配置数据库连接,配置完成后单击【确认】按钮。MySQL数据库连接的配置
在图中的SQL框中编写查询数据表company_b的SQL语句,然后单击【预览】按钮,查看数据表company_b的数据是否成功从MySQL数据库中抽取到表输入流中
双击“排序合并”控件,在字段框中,指定按字段id进行升序排序。
双击“增加序列”控件,进入“增加序列”配置界面,在“值的名称”处,指定要增加列的列名,这里使用默认的名称,即valuename,其它配置项不作任何改变;单击【确定】按钮,完成“增加序列”控件的配置。
双击“字段选择2”控件,在“选择和修改”处选择和修改要输出的字段
双击“表输出”控件,单击目标表右侧的【浏览】按钮,指定输出目标表,即数据表company(该表需提前创建,这里不作演示);勾选“指定数据库字段”复选框,用于将数据表company的字段与“字段选择2”控件输出流中的字段进行匹配
单击“数据库字段”选项卡;再单击【输入字段映射】按钮,弹出“映射匹配”对话框;依次选中“源字段”选项框的字段和“目标字段”选项框对应的字段,再单击【Add】按钮,将一对映射字段添加至“映射”选项框中。
4.运行转换并查看结果
运行创建的转换,实现将两个数据合并到一个数据源
查看数据表company是否已成功插入40条数据
二、不一致数据的转换
1.准备数据
数据表company中存在同一品牌型号的手机,售价却不同,我们需要通过与供货商提供的标准价格表suppliers进行比较,得出不一致数据,从而进行修改,最终输出到数据表company中
标准价格表suppliers创建语句
create table `suppliers` (
`id` int (30),
`brand` varchar (150),
`model` varchar (150),
`unitPrice` varchar (150)
);
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('1','华为','华为nova 5 Pro(8GB/128GB/全网通)','2999');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('2','三星','三星GALAXY Note 10+(12GB/256GB/全网通/5G版)','7999');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('3','OPPO','OPPO Reno2(8GB/128GB/全网通)','2999');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('4','华为','华为Mate30(8GB/128GB/全网通/5G版/玻璃版)','4999');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('5','OPPO','OPPO Reno 10倍变焦版(8GB/256GB/全网通)','4299');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('6','vivo','vivo NEX 3(8GB/256GB/全网通/5G版)','5698');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('7','vivo','vivo NEX 3(8GB/128GB/全网通)','4998');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('8','vivo','vivo iQOO Pro(8GB/128GB/5G全网通)','3798');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('9','小米','小米9(8GB/256GB/全网通)','2999');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('10','华为','华为Mate 20 X(8GB/256GB/全网通/5G版)','6199');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('11','OPPO','OPPO R17(8GB RAM/全网通)','2499');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('12','苹果','苹果iPhone 11 Pro Max(6GB/64GB/全网通)','9599');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('13','三星','三星Galaxy S10+(8GB RAM/陶瓷版/全网通)','7499');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('14','苹果','苹果iPhone 11(4GB/128GB/全网通)','5999');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('15','苹果','苹果iPhone 11 Pro(6GB/256GB/全网通)','9999');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('16','华为','华为P30 Pro(8GB/128GB/全网通)','4988');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('17','苹果','苹果iPhone 11(4GB/256GB/全网通)','6799');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('18','小米','小米9 Pro(8GB/256GB/全网通/5G版)','3799');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('19','三星','三星GALAXY Note 10(8GB/256GB/全网通)','6599');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('20','苹果','苹果iPhone 11(4GB/64GB/全网通)','5499');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('21','vivo','vivo X27 Pro(8GB RAM/全网通)','3598');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('22','苹果','苹果iPhone 11 Pro(6GB/64GB/全网通)','8699');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('23','华为','华为Mate30 Pro(8GB/128GB/全网通)','5799');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('24','小米','小米MIX 3(6GB RAM/全网通)','2299');
insert into `suppliers` (`id`, `brand`, `model`, `unitPrice`) values('25','华为','华为Mate30 Pro(8GB/256GB/全网通/5G版/玻璃版)','6899');
2.打开kettle工具创建转换
3.配置步骤
双击“表输入”控件,单击【新建】按钮,配置数据库连接,配置完成后单击【确认】按钮。
在SQL框中编写查询数据表company中品牌型号不一致数据的 SQL语句,然后单击【预览】按钮,查看数据表company中品牌型号不一致数据是否成功从MySQL数据库中抽取到表输入流中
SQL语句如下:
SELECT brand,model FROM company c2
WHERE c2.id NOT IN
(SELECT c1.id FROM suppliers s1
JOIN company c1 ON s1.brand = c1.brand
AND s1.model = c1.model
AND s1.unitPrice=c1.unitPrice);
双击“表输入2”控件,在SQL框中编写SQL语句,查询出不一致数据在数据表suppliers中的全部信息;在“从步骤插入数据”的下拉框选择“表输入”步骤;勾选“执行每一行”处的复选框,用于将表输入控件流中的数据放入到SQL语句对应的参数位置,通过条件查询与数据表suppliers中的数据进行匹配
双击“字段选择”控件,在“选择和修改”选项卡的“字段”处添加表输入2控件流中的所有数据字段,并将字段unitPrice改名成unitPrice1
选择“移除”选项卡,切换到“移除”选项卡界面,添加需要移除字段,这里添加的是字段id
双击“表输入3”控件,单击【新建】按钮,配置数据库连接,配置完成后单击【确认】按钮
在SQL框中编写查询与标准价格表(供货商提供的价格表)中品牌型号不一致数据的SQL语句,然后单击【预览】按钮,查看数据表company中品牌型号不一致数据是否成功从MySQL数据库中抽取到表输入流中
sql语句如下:
SELECT id,brand,model,unitPrice FROM company c2
WHERE c2.id NOT IN
(SELECT c1.id FROM suppliers s1
JOIN company c1 ON s1.brand = c1.brand
AND s1.model = c1.model
AND s1.unitPrice=c1.unitPrice);
双击“记录集连接”控件,在“第一个步骤”处的下拉框中选择“字段选择”控件,“第二个步骤”处的下拉框中选择“表输入3”控件,用于将“字段选择”控件流中的数据与“表输入3”控件流中的数据进行合并连接;在“第一个步骤的连接字段”和“第二个步骤的连接字段”处添加连接字段,这里添加的连接字段是brand、model,用于将“字段选择”控件流中的字段brand、model与“表输入3”控件流中的字段brand、model进行连接;在“连接类型”处的下拉框选择连接类型,这里选择的RIGHT OUTER,即右外连接
双击“字段选择2”控件,进入“选择/改名值”界面,并在“选择和修改”选项卡的字段名称处填写id和unitPrice1,用于在插入/更新控件中,通过唯一字段id修改对应的价格unitPrice1字段内容
双击“插入/更新”控件,单击目标表右侧的【浏览】按钮,弹出“数据库浏览器”窗口,选择目标表company;单击【获取字段】按钮,用来指定查询数据所需要的关键字,也可通过手动输入,指定查询数据所需要的关键字,这里选择的是数据表company中的id字段和输入流里面的id字段;单击【获取和更新字段】按钮,用来指定需要更新的字段
4.运行转换并查看结果
查看数据表company是否已成功将数据表company中品牌型号相同、价格不同的数据修改成品牌型号价格均相同的数据
三、总结
大数据时代如果想要得到需要的数据,而这些需要的数据有可能来源于多个不同的数据源中,此时,我们可以将多个数据源进行合并操作,从而获取到所需要的数据。不一致数据转换主要是将不同业务系统中的相同类型的数据进行统一,例如同一个供应商在结算系统的编码是XX0001,而在CRM(客户关系管理系统)中编码是YY0001,这样就需要将这两个业务系统中的数据抽取过来进行统一转换,转换成同一个编码。