您的位置:首页 > 数据库 > Oracle

关于ETL 工具 kettle

2014-08-12 15:21 176 查看
这几天一直在看kettle的内容,昨天的一项任务是 将一个老库中的数据转到临时库中。还是像往常一样,批量生成~

结果出现如下问题:

2014/08/12 12:26:42 - 写到 [T_BASE_008_PERFORM_TEAM_ANNALS].0 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : Because of an error, this step can't continue: 

2014/08/12 12:26:42 - 写到 [T_BASE_008_PERFORM_TEAM_ANNALS].0 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : org.pentaho.di.core.exception.KettleException: 

2014/08/12 12:26:42 - 写到 [T_BASE_008_PERFORM_TEAM_ANNALS].0 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : Error batch inserting rows into table [T_BASE_008_PERFORM_TEAM_ANNALS].

2014/08/12 12:26:42 - 写到 [T_BASE_008_PERFORM_TEAM_ANNALS].0 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : Errors encountered (first 10):

2014/08/12 12:26:42 - 写到 [T_BASE_008_PERFORM_TEAM_ANNALS].0 - ERROR (version 4.4.0-stable, build 17588 from 2012-11-21 16.02.21 by buildguy) : ORA-12899: 列 "REPORTTEST"."T_BASE_008_PERFORM_TEAM_ANNALS"."ORIGINAL_OPERA" 的值太大 (实际值: 251, 最大值: 200)

可是 T_BASE_008_PERFORM_TEAM_ANNALS 这张表计算 length(ORIGINAL_OPERA)  显示最常的也就 130 。。。

TNN的 之前转移500多张表都没问题,今儿是怎么了?

其他表都没有问题,唯独T_BASE_008_PERFORM_TEAM_ANNALS,就会出错。

查找了大量说法,

发现有的ORA-12899 这个报错与字符集相关的说法。。。

但是我的情况是,源数据与目标数据是在同一个库里的。字符集应该是一样的吧。。。

由于我的pl/sqldev 有点儿问题,就用navicat查看  了下表结构。T_BASE_008_PERFORM_TEAM_ANNALS,

问题出来了, 对比了一下源表 与目标表的表结构。

有些字段类型不一样,

源的 nvarchar2, 在目标表中全变成了varchar2了。。。看来是kettle的问题。kettle建表时自动生成的语句有待检查。但是批量生成时就没法检查了。

在目标表中将对应源的nvarchar2都改过来。

job重新跑起来~ 恩~完成~

===============================================================================

后来查了一下 varchar2 与 nvarchar2的区别。

nvarchar2 把单个字母、汉字都当成一个字符,认为是1字节;

varchar2   则字母1字节、汉字2字节;

由于kettle根据 源的nvarchar2(200),在目标 生成的新varchar2(200);//这样,实际目标空间只有源空间的一半。

那么实际数据转移时必然不够存的。 

原来用length() 查到的是字符个数,两个表必然都是200以内,所以没有发现问题;

   lengthb() 则 返回 字节个数,恩,这个要直观一些,以后就用这个了。

===============================================================================

总结一下:

lengthb( )
//返回字节数

length()
//返回字符数

  kettle 自动生成表 的语句 会将nvarchar2→varchar2;

nvarchar2 把单个字母、汉字都当成一个字符,认为是1字节;

varchar2   则字母1字节、汉字2字节;

===============================================================================

唉,最后再吐槽一下。。kettle毕竟是开源工具,用了这段时间,感觉是,这玩意儿做的太粗糙了,各种细节功能也不齐全。。。虽说结合java二次开发后功能很强大。但是,对于我这样的新手来说,一路上真是各种问题啊,而且也没有哪篇详细文档能做参考。

建议从项目进度的考虑还是选用其他商业ETL工具好些。

好了继续工作 (ง •̀_•́)ง

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

执行表输出,报错‍ORA-00904,“XXX”标识符无效。其中XXX是字段,在源表内,但目标表内没有。

解决方法:将表输出配置页面的specify database fields打上勾。 (¬、¬) 。。这里又想吐槽kettle的愚钝了。。。既然都已经指定了对应字段,还要另外打个勾浪费操作。。。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

注意!!! 

Generate SQL 并不会 执行job内的SQL语句,而是立即检查当前过程内需要的SQL语句,比如建表,改表。(因此无法通过修改job文件内的建表SQL语句来达到修改表结构的目的)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

关于添加一个自增字段 ,找到两个组件:【Add value fields changing sequence】 和 【增加序列 】

如图构建模型:


结果:


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

实验:重新run时,【增加序列】节点 不能继续增长,会重1开始。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

kettle 的表输出 内首次读取的字段名 会存入缓存, 如果此间更改了字段名称,kettle的的表输出组件内是不会更改的,需要先Tools->Database->Clear Cache.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kettle spoon oracle ETL