如何用kettle数据库增量同步检验数据准确性?

用Kettle增量抽取数据,在不改变源表结构的情况下,有没有比较快的方案?
用Kettle增量抽取数据,在不改变源表结构的情况下,有没有比较快的方案?
源表和目标表上加时间戳的方法不是很适合现在要做的东西,尝试过每次都将目标表清空再插入的方法,效率的确快了很多,每秒能有20w条记录左右的速度,但使用插入/更新则慢了很多,不知道Kettle的内部机制是怎么处理的。大家有没有什么比较好的增量抽取的好方案?
我现在用的通过主键判断是否插入/更新,效率只有1000条/秒,不是很满意,有没有其他的好的增量抽取方式?
大哥认不认识玩Kettle玩的好的啊,求指导啊
插入更新比较慢,首先会判断是否存在,存在的话(不更新或更新可选),不存在则插入。(其实插入更新只不过是两个两个功能合体,操作者简单而已)
建议分开处理,(单步处理效果比较理想)
1、删除。删除相同的记录
2、表输入,插入数据查看: 40074|回复: 56
使用Kettle同步数据
认证徽章论坛徽章:168
同步数据常见的应用场景包括以下4个种类型:Ø&&只增加、无更新、无删除Ø&&只更新、无增加、无删除Ø&&增加+更新、无删除Ø&&增加+更新+删除
认证徽章论坛徽章:168
只增加、无更新、无删除对于这种只增加数据的情况,可细分为以下2种类型:1)& && &&&基表存在更新字段。通过获取目标表上最大的更新时间或最大ID,在“表输入”步骤中加入条件限制只读取新增的数据。
1.jpg (7.64 KB, 下载次数: 52)
14:37 上传
这里要注意的是,获取最大更新时间或最大ID时,如果目标表还没有数据,最大值会获取不了。其中的一个解决方法是在“获取最大ID”步骤的SQL中,加入最小日期或ID的联合查询即可,如:SELECT MAX(ID) FROM (SELECT MAX(ID) AS ID FROM T1 UNION ALL SELECT 0 AS ID FROM DUAL)2)& && &&&基表不存在更新字段。通过“插入/更新”步骤进行插入。
2.jpg (4.71 KB, 下载次数: 44)
14:37 上传
插入/更新步骤选项:
3.jpg (49.83 KB, 下载次数: 31)
14:37 上传
认证徽章论坛徽章:168
只更新、无增加、无删除通过“更新”步骤进行更新。
4.jpg (4.33 KB, 下载次数: 15)
14:39 上传
更新选项:
5.jpg (43.75 KB, 下载次数: 16)
14:39 上传
认证徽章论坛徽章:168
增加+更新、无删除通过“插入/更新”步骤进行插入。
6.jpg (4.71 KB, 下载次数: 29)
14:39 上传
区别是“插入/更新步骤”中的选项,去掉“不执行任何更新”的勾选:
7.jpg (49.41 KB, 下载次数: 26)
14:39 上传
认证徽章论坛徽章:168
增加+更新+删除这种数据同步情况,可细分为以下2种情况:1)& && &&&源库有表保存删除、更新和新增的信息。通过条件判断,分别进行“插入/更新”和“删除”即可,如下图所示。
8.jpg (12.08 KB, 下载次数: 60)
14:41 上传
2)& && &&&源库没有保存增删改信息Kettle提供了一种对比增量更新的机制处理这种情况,可通过“合并记录”步骤实现,该步骤的输入是新旧两个数据源,通过关键字进行数据值比对,对比结果分为以下4种类型:“Identical” : 关键字在新旧数据源中都存在,域值相同“changed” : 关键字在新旧数据源中都存在,但域值不同“new” :&&旧数据源中没有找到关键字“deleted”:&&新数据源中没有找到关键字两个数据源的数据都进入下一步骤,上述4种结果类型作为输出表的标志字段进行保存。以下为示例:Ø&&源数据库测试脚本create table k1 (f1 varchar2(200),f2varchar2(200))truncate table k1;insert into k1(f1,f2) values('1','11');insert into k1(f1,f2) values('2','22');insert into k1(f1,f2) values('5','5');Ø&&目标数据库测试脚本create table k1 (f1 varchar2(200),f2varchar2(200))truncate table k1;insert into k1(f1,f2) values('1','1');insert into k1(f1,f2) values('2','2');insert into k1(f1,f2) values('3','3');insert into k1(f1,f2) values('4','4');& && && &合并过程如下:
9.jpg (22.7 KB, 下载次数: 75)
14:41 上传
其中“合并记录”步骤的选项:
10.jpg (25.08 KB, 下载次数: 30)
14:41 上传
执行后,查询K1_TEST结果如下:
11.jpg (7.75 KB, 下载次数: 22)
14:41 上传
可以看到,该结果表的BZ字段保存了更新、删除、新增的记录信息,通过条件分支即可分别对这些记录进行相应的处理。 “条件”选项:
12.jpg (37.97 KB, 下载次数: 33)
14:41 上传
认证徽章论坛徽章:168
Kettle提供了可视化的设计工具,基本上可通过拖拉配置的方式实现以上4种类型的数据同步,操作上相对较为简单。数据同步的性能与源数据库、目标数据库以及执行Kettle转换操作的主机相关,在笔者的测试环境上(源数据库和目标数据库部署在双核CPU/4G内存的PC机上、执行Kettle转换操作的主机配置为双核CPUx2/4G内存,JVM内存堆栈为256M)、最后一种类型的数据同步,15w的数据,在3分钟内可以完成。
13.jpg (63.36 KB, 下载次数: 14)
14:43 上传
认证徽章论坛徽章:168
PDF文档,enjoy it。
(604.62 KB, 下载次数: 1588)
14:45 上传
点击文件名下载附件
btw:pub发表带图片的帖子太麻烦了.....
论坛徽章:289
thanks for sharing
论坛徽章:6
看了,很不错哦,一直不知道有删除的情况要怎么处理。
论坛徽章:0
我想问下,你合并行这个控件中标志字段&BZ&是kettle的一个临时变量吗?加入到数据流然后直接在K1_TEST添加了这一列?
itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号:10 广播电视节目制作经营许可证:编号(京)字第1149号博客分类:
需求:
1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle。
2.你是否还在使用kettle重复的画着:表输入-表输出、创建表,而烦恼。
下面为你实现了一套通用的数据库迁移流程。
技术引导:
实现之初,在kettle提供的例子中找到了一个类似的(samples\jobs\process all tables)。
通过相关改造,终于达到目标。
实现过程解剖:
整套流程分为:2个job,4个trans。
使用到的Trans插件:表输入、字段选择、复制记录到结果、从结果获取记录、设置变量、自定义java脚本、表输出。
1.大job。
2.要迁移的源库表名称获取,并设置到结果集,为下面的job使用。
3.配置子job为前面的每一条记录(即每个表)执行一次该子job
4.下面是子job。
5.获取记录中的表名称,并设置为到变量。
6.读取当前表的结果信息,并在目标库中创建表(这个是难点)。
因为只需要获取抓取要抽取表的结构信息,故在sql后面加上 where 1=2。
下面代码是创建目标库表。
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
// First, get a row from the default input hop
Object[] r = getRow();
org.pentaho.di.core.database.DatabaseMeta dbmeta =
java.util.List list = getTrans().getRepository().readDatabases();//3.x中获取资源库的所有数据库连接信息用getDatabases();
if(list != null && !list.isEmpty())
for(int i=0;i&list.size();i++)
dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);
//下面是目标库的数据库连接,大家可根据需要修改
if("mysql_test".equalsIgnoreCase(dbmeta.getName()))
if(dbmeta!=null)
org.pentaho.di.core.database.Database db=new org.pentaho.di.core.database.Database(dbmeta);
db.connect();
String tablename = getVariable("TABLENAME");
logBasic("开始创建表:" + tablename);
if(tablename!=null && tablename.trim().length()&0)
String sql = db.getDDL(tablename, data.inputRowMeta);//${TABLENAME}
db.execStatement(sql.replace(";", ""));
logBasic(sql);
catch(Exception e)
logError("创建表出现异常",e);
db.disconnect();
7.表数据迁移。
8.差不多就行了,本人使用mysql到mysql、oracle的测试是没有问题的不过在测试过程中,发现源表若存在有blob的表,会有问题,可能是由于表输出没有指定字段的原因,具体解决办法,也没有去多想,以后有时间在完善把。
上面的整套流程的是在kettle4.3下完成的,附件里面可下载完整流程。
5.x运行到创建表结构步骤报错,原因data.inputRowMeta为空,因为在第6步
在sql后面加上 where 1=2,导致表输入步骤没有抽取到记录,5.x里结构也变成了null。
解决:
把where 1=2去掉,然后,在表输入的限制行设置为1,即可,本人亲测。
下载次数: 2132
浏览 68977
环境:kettle 6.0 +源和目标都是mysql,用样例无法运行,改写java代码控件的脚本可以执行成功,但是字段类型不能和源库一样改写哪个控件?JAVA里面我没改成功。
在第六步的时候报错了呢? 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) : Unexpected error 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) : java.lang.NullPointerException 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) :
at Processor.processRow(Processor.java:9) 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) :
at org.pentaho.di.trans.steps.userdefinedjavaclass.UserDefinedJavaClass.processRow(UserDefinedJavaClass.java:1181) 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) :
at org.pentaho.di.trans.step.RunThread.run(RunThread.java:50) 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) :
at java.lang.Thread.run(Thread.java:619)能给看一下吗?谢啦在新版本中,这个表输入查询不到记录(因为sql有1=2),在第六步的获取表输入输出结构为空!导致了你上面的错误,目前本人没有去研究,建议没有用到新版本功能,还是用4.x较妥。
楼主你好,我也是用资源库做的,现在就是到在目标库建表的时候,执行到java程序中取data.inputRowMeta数据总是null,这里面因该是真么数据呀,怎么取出数值呢?我刚才试了一下5.x里测试这个示例确实出现这个问题。要修改一个地方。
在第六步的时候报错了呢? 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) : Unexpected error 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) : java.lang.NullPointerException 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) :
at Processor.processRow(Processor.java:9) 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) :
at org.pentaho.di.trans.steps.userdefinedjavaclass.UserDefinedJavaClass.processRow(UserDefinedJavaClass.java:1181) 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) :
at org.pentaho.di.trans.step.RunThread.run(RunThread.java:50) 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from
14.11.32 by buildguy) :
at java.lang.Thread.run(Thread.java:619)能给看一下吗?谢啦你用的不是资源库把,所以才会报空指针异常、
& 上一页 1
浏览: 95275 次
来自: 长沙
据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
亲,在迁移空表时出现空指针异常的具体解决办法是怎样的,求解答
你好,用的kettle 7.0 在执行的时候,创建表的那句出错 ...
环境:kettle 6.0 +源和目标都是mysql报错如下, ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Kettle(PDI)中“数据库查询”步骤的理解(二) - 为程序员服务
Kettle(PDI)中“数据库查询”步骤的理解(二)
同样我来建两张表,并插入几条数据
CREATE DATABASE /*!32312 IF NOT EXISTS*/`qq_test` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `qq_test`;
/*Table structure for table `departments` */
DROP TABLE IF EXISTS `departments`;
CREATE TABLE `departments` (
`id` int(11) DEFAULT NULL,
`dep_name` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
/*Data for the table `departments` */
into `departments`(`id`,`dep_name`) values (1,'学生'),(2,'老师'),(3,'程序员'),(4,'乞丐');
/*Table structure for table `employees` */
DROP TABLE IF EXISTS `employees`;
CREATE TABLE `employees` (
`id` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`dep_id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
/*Data for the table `employees` */
into `employees`(`id`,`name`,`dep_id`) values (1,'qq',1),(2,'mm',2),(3,'qm',12);
效果图如下:左上角是employee表,右上角是departments表。下面的文件是在进行了kettle的转换后的结果。
从效果图上我们看到,即使是在后面的查询表中没有的数据,而在第一个表输入中有的数据,也会在输出流中输出,所以我认为写得不对。
kettle转换的截图如下:
转换中的配置如下图:
所以在我看来,这一个步骤做的就是左联接。
转载请注明: &
只为心中的明天
原文地址:, 感谢原作者分享。
您可能感兴趣的代码kettle检验字段的值_中华文本库
Kettle中有两种脚本文件,transformation和job,transformation完成针对数据 的基础转换...双击编辑表输出如下: 要获取的字段设置如下所示: 点击输入字段映射进行字段选择...
kettle操作手册_计算机软件及应用_IT/计算机_专业资料。1. 什么 Kettle? Kettle...组件 名称:选择替换的字段 需要转换成 NULL 的值:需要转换成 NULL 的值 2....
kettle节点介绍_计算机软件及应用_IT/计算机_专业资料。介绍KETTLE中的使用节点...24.Add XML 该节点进行行内容自动转化为xml格式并保存到数据库字段中的工作。...
Excel 工作表中的数据,都有特定的数据类型,因此在读取数据时,需要为每个字段...将.kettle 文件夹删除,重写用英文名称创建后,成功启动。 8、 在 WINDOWS 下...
~/kettle/data-integration/spoon.sh 二、 使用 Kettle 同步数据同步数据常见的...2) 基表不存在更新字段。 通过“插入/更新”步骤进行插入。 插入/更新步骤选项...
ETL产品工具Kettle简介_计算机软件及应用_IT/计算机_专业资料。ETL 产品工具 Kettle...会根据查询条件中字段进行判 断 更新 删除 根据处理结果对数据库进行更新, 若...
(注: kettle 提供猜字段名称的功能,但好象还没有完成,点了没有反映,期待更新。所以, 数据的第一行,kettle 预处理为字段名,不会写入数据库中 如下图: ) 如果...
ETL工具kettle学习总结_计算机软件及应用_IT/计算机_...= 可以获得字段 Name 的前一条记录的值。 ...当检测表的记录数是否达到一定条件 1.14 Write To...
关键字左边的表字段里面的,另外一个数据流就是 你在前一个步骤传进来的,它放在用来查询的关键字 的右边,Kettle 首先用你传 进来的 key 在数据库中查询这些记录...
kettle 介绍 1.1 什么是 kettle Kettle是 “Kettle E.T.T.L. Envirnonment...3、元数据:修改数据字段的名称、类型、长度和精度。 选项: 1、字段名称:选择...}

我要回帖

更多关于 kettle 数据库查询 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信