下面是试验的主要步骤:
在上一篇文章中LZ已经介绍了,实验的环境和实验目的。
在本篇文章中主要介绍侧重于对Kettle ETL的相应使用方法,
在这里LZ需要说明一下,LZ成为了避免涉及索引和表连接等操作,
在数据库mysql中重新创建一个不带有索引和外键约束的 customers数据库表。
但数据集合不变。
所以在后文中国使用,mysql.customers来代替前篇文章中的test.customers。
下面的截图是使用Spoon工具来整体对这个流程的描述:
(图)
首先需要使用Kettle来建立两个对数据库数据源的连接:
如图所示: 其中我们所使用的:classicmodels.customers(数据库名.表名)
这张表对应的数据源连接名称是: MysqlConn1 创建数据源连接MysqlConn1如下图所示:
而需要与classicmodels.customers做数据同步的表mysql.customers(数据库名.表名) 这个对应的连接是:
MysqlConn2。 在Spoon中创建MysqlConn2的截图如下所示:
在创建数据库连接之后,需要在相应的transformation中 拽入表输入这一个step。
因为是关于不同数据库中的数据表做数据同步,
所以数据流的流动方向是,
从mysql.customers表中出来,
一一与classicmodels.customers表中的每个记录进行比较等等操作。
而它们来自于不同的数据源的两张表, 所以需要两个表输入(step),
每一个step对应的是kettle源码中的 不同的类,而你从工具栏中将相应的step拖到工作区间的时候,
实质上是完成了,对类对象的实例化操作。
为了方便记忆,把classicmodels.customers对应的那个表输入命名为 classicmodels.customers;
而把mysql.customers对应的那个表输入step重新命名为mysql.customers(这里命名是随意的,是为了方便记忆,
当然读者还可以根据个人的习惯,比如顺便标志出哪一个是 旧数据源,哪一个是新数据源,等等)
具体的操作如下图所示:
在这里仅选取针对于classicmodels.customers这一个表输出进行讲述(二者的设置过程是一样的):
在这里需要注意的是,首先应该从下拉菜单中选取与之对应的数据源连接,
然后千万不能忘到此仅仅完成的是对数据库的选取,
接下来需要点击“获取SQL查询语句”
一次来选取这个数据源主要是针对数据库的那个表进行抽取数据的。
然后呢,从核心对象工具栏中选择出来,合并记录的Step,
将其拖拽到对应的工作区域,并将俩个表输入step与之相连接
(hop指的是用于连接两个step的矢量连线)。
接下来就是根据实验要求对合并记录进行相应的设定,具体的操作请看截图:
在这里面需要说明的是, 弹出窗口的第一个选项: 旧数据源应该是需要被同步的,就是里面的数据比较陈旧, 需要根据新数据源中的数据进行调整。
而新数据源,在实际的应用中指的是每天或是定期获取的最新数据所对应的数据源。
旧数据源通常是根据新数据源进行相应的增、删、改等一系列操作的。
对于所测试的数据,我是这样想的, 首先应该自己先想好,测试的情况应该大致分为几种情况。
然后根据相应的情况来自己来写一些少量的几条简单的数据集合。
进行测试, 待到得到想要的结果之后,这个时候基本上你的step设计已经完成了, 这样再在这个transformation上面来跑比较大的数据集的话就比较能考到结果了。
跑大的数据集
一个是可以找到一些你自己之前没有考虑到的情况,
二就是可以可以很容易看出来到底数据是在哪一个step的上面 耗费的时间比较长,
可以针对耗时比较长的step作相应的优化处理。
进行step替换或是其他的一些脚本什么的(抱歉,这里LZ暂时也不没有亲自试验验证)预先处理的方法。
其实提高同步数据效率它的主旨就是减少需要处理的数据,
所以在进行同步数据处理之前,
可以调用一些分支step来过滤或是删除一些重复的数据等等。
具体情况是需要具体的分析的。
这里需要说明一下的就是:Kettle中的合并记录这一个Step是这样的:
源库是不提供保存增删改信息的,
而Kettle会提供一种用于 对比输入的新旧两个数据源,
通过关键字进行逐个比较每条记录。
会根据具体的比对的出一下的四种返回值, 而且这四个返回值的类型是String字符串类型, 是的,没错,因为Kettle就是使用Java实现的,
所以一些变量直接与Java中的数据类型是直接对应的。
1、"identical":它对应的是关键字在新旧数据源中, 都是一致的,并且该关键字所在的记录的各个字段的域值相同的话,
则对旧数据源所对应的数据表不做任何处理。
2."changed":关键字在新旧数据源中都是存在的,但是关键字所对应的 记录的域值是不相同的,
这是要将旧数据源依照新数据源做更新操作。
3."new": 旧数据源所对应的数据表中没有与新数据源表中出现的关键字匹配的话,
则将该新数据源关键字对应的记录插入到旧数据源对应的数据表中。
4."deleted": 在旧数据源数据表中的关键字与新数据源表中的所有关键字都是不匹配的。
这种情况就需要把旧数据源中的该关键字对应的那条记录从旧数据源表中删除。
所需要进行匹配的关键字段是新旧记录源的主键所在字段, 而所要进行修改和更新的字段是旧数据库中的所有字段。
为了确保程序的正常进行, 可以先针对合并记录这个step先快速启动一下,
下图是启动合并记录之后,相应的返回值截图:
由于记录有点长,所以只截取了对应的changed、deleted、identical、 这四个所对应的字段。
刚刚好和设想的是一致的。(也就是说与LZ设计的数据表中的数据值,详情请看前一篇实验环境搭建,其实说不上是设计,就是简单修改几个数吧...呵呵)
而就像上面所讲述的一样,合并记录在执行之后返回{identical,changed,deleted,new}这四种String的值。
而后续的synchronize after merge 这个step会根据接收到的 这四种不同的String做出相应的对旧数据源的{增、删除、更新、或是不动} 这四种操作。
既然这一步得到了与设想一直的结果, 那么继续向下使能合并记录到同步数据之间的hop吧~
正如想象的一样, 数据被成功的从新数据源对应的classicmodel.customers中 同步到旧数据源对应的mysql.customers数据表中。
下图是整体的运行时间截图:
你看,mysql.customers对应写的是10条LZ改写的数据。
而classicmodel.customers对应的是我们从第三方下载的数据集合进行简化之后,
所得到的的数据集中的记录数目。
接下来将要实验的是,针对有索引和外键还有各种约束进行数据同步中所需要采用的方法。
其实,数据库中的数据表在实际的情况下,真的是各种关联,并且是牵一发而动全身的。
所以,还是继续学习吧,加油啦,米娜~
Oracle 通过dblink和job方式实现两个数据库表之间数据同步
需求是需要将Database_A中的dev_test表中的数据同步到Database_B中的dev_test表中. 因为是通过Database_B去同步Database_A库中的数据,所以操作都建立在 ...
Vc数据库编程基础MySql数据库的表增删改查数据
Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...
MySQL的入门与使用,sqlyog对数据库,表和数据的管理
MySQL的入门 1.到mysql官网下载. 2.安装mysql软件(一定要放到英文路径下) 3.使用 验证是否成功 将mySQL的bin路径添加到系统环境变量Path中 打开dos命令窗口 Wind ...
将MySQL一张表的数据迁移到MongoDB数据库的Java代码示例
Java代码: package com.zifeiy.snowflake.handle.etl.mongodb; import java.sql.Connection; import java.sql ...
linux mysql 数据库操作导入导出 数据表导出导入
linux mysql 数据库操作导入导出 数据表导出导入 1,数据库导入 mysql -uroot -p show databases; create database newdb; use 数据库 ...
MySQL数据库如何解决大数据量存储问题
利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开 ...
MySQL数据库使用mysqldump导出数据详解
mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数 ...
Vc数据库编程基础MySql数据库的表查询功能
Vc数据库编程基础MySql数据库的表查询功能 一丶简介 不管是任何数据库.都会有查询功能.而且是很重要的功能.上一讲知识简单的讲解了表的查询所有. 那么这次我们需要掌握的则是. 1.使用select ...
MySQL数据库以及表的管理
MySQL数据库以及表的管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 今天我们探讨的话题就是如何使用MySQL做开发,我们运维的主要工作不是去开发SQL的,但尽管如此,我们有 ...
随机推荐
MATLAB取余求模
(1)fix(x) : 截尾取整 >> fix( [3.12 -3.12]) ans = 3 -3 (2)floor(x): 不超过x 的最大整数.(高斯取整) >> ...
Java中Sting转Timestamp
Java中Sting转Timestamp 时间转换.png
Flex 播放视频
Flex提供视频控件(VideoDisplay Control)播放图像和声音. 视频控件只支持播放,暂停和停止功能.不提供倒退和前进功能.只支持播放FLV格式的影片. 1. 视频控件标签 对应的MX ...
字符转十六进制 String =>; HEX using ";hexdump"; on linux
hexdump 是一款非常简单的有效的将别的形式的文档转换成十六进制的工具. 最详细的使用说明都在 man hexdump 里面,请自行查阅. 这里我摘出几个常用的例子,一目了然: 这里我做了一个实验 ...
BootStrap的入门和响应式的使用
在做前端开发中,其实有百分之四十的时间用来布局写样式,百分之三十用来写JS逻辑交互,百分之三十时间用来测试调bug,可以看的到的是,用在布局+样式的时候会比较多, 所以会有很多的前端框架诞生,例如bo ...
机器学习-GBDT和XGboost
参考: 陈天奇slides : https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf Friedman GBDT 论文: htt ...
20 python 初学(logging模块)
学习网站:https://www.cnblogs.com/yuanchenqi/articles/5732581.html logging 模块: # _author: lily # _date: 2 ...
vue分页组件二次封装---每页请求特定数据
关键步骤: 1.传两个参数:pageCount (每页条数).pageIndex (页码数): 2.bind方法的调用
CSS 简介、 选择器、组合选择器
#CSS 装饰器引入
< ...Linux文件下载(转)
wget是Linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径 例如: # wget http://www.linuxsense.org/xxxx/xxx. ...