多数据源合并和不一致数据的转换

一、多数据合并

目录

一、多数据合并

        1.准备数据

        2.打开kettle工具创建转换

        3.配置步骤

        4.运行转换并查看结果

二、不一致数据的转换

        1.准备数据

        2.打开kettle工具创建转换

        3.配置步骤

        4.运行转换并查看结果

三、总结


        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,这样就需要将这两个业务系统中的数据抽取过来进行统一转换,转换成同一个编码。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ETL是英文Extract、Transform、Load的缩写,它是数据仓库建设中最基础的环节之一,主要用于数据的抽取、清洗、转换和加载。ETL的实现可以将来自不同数据源数据进行统一处理和分析。 实现数据抽取与转换的过程通常包括以下步骤: 1. 抽取数据:从不同的数据源中提取需要的数据,如关系型数据库、文件、Web服务、API等。 2. 清洗数据:对抽取的数据进行清洗,如去除重复数据、空数据数据格式转换数据合并等,以确保数据的准确性和完整性。 3. 转换数据:对清洗过的数据进行转换操作,如数据结构的转换数据计算、数据聚合等。 这一步的目的是为了将不同数据源数据统一到一个数据模式下,方便数据分析和处理。 4. 加载数据:将转换后的数据加载到数据仓库中,如数据集市、数据仓库等,以供后续的分析和应用。 ETL的实现需要依赖一些工具和技术,如数据仓库工具、ETL工具、ETL脚本、SQL等。目前比较流行的ETL工具有Informatica、IBM DataStage、Microsoft SQL Server Integration Services等。使用这些工具可以实现大规模数据ETL处理和管理,提高数据处理效率和数据质量。 ETL实现数据抽取与转换数据仓库建设的重要一步,通过ETL的清洗和转换操作,可以将来自不同数据源数据整合到一个数据模型下,提高数据一致性和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值