解决kettle字符转换错误
▶错误描述
在执行转换抽取数据时,由于姓名、地址等CHAR类型字段中存在特殊字符,造成导演CharConversionException异常。
异常信息如下:
▶原因分析:
通过对比法分析:同样的表数据抽取,在莱芜数据集市的业务数据会出现此问题,而德州不会。由此可推断出问题原因出在数据上,数据中存在特殊字符。
▶解决方法
前提:根据与业务人员沟通,可以对有问题的数据进行舍弃。所以运用kettle的“定义错误处理”功能。
具体步骤如下:
1.数据准备
创建表A1、B1、C1,并添加数据。SQL如下:
CREATE TABLE A1(
A VARCHAR(120) NOT NULL,
B VARCHAR(120),
C VARCHAR(120));
CREATE TABLE B1(
A VARCHAR(120),
B VARCHAR(120) ,
C VARCHAR(120));
CREATE TABLE C1(
A VARCHAR(120),
B VARCHAR(120) ,
C VARCHAR(120) ,
errorNum VARCHAR(3000),
errorDesc VARCHAR(3000),
errorName VARCHAR(3000),
errorCode VARCHAR(3000));
INSERT INTO B1 (A, B, C) VALUES ('1', '1', '1');
INSERT INTO B1 (A, B, C) VALUES (null, '2', '2'); --此条数据A字段的值为空。
INSERT INTO B1 (A, B, C) VALUES ('3', '3', '3');
INSERT INTO B1 (A, B, C) VALUES ('4', '4', '4');
INSERT INTO B1 (A, B, C) VALUES ('5', '5', '5');
场景设计:A1表中的A字段为非空字段,B1表中的A字段为可空字段且有A字段为空的数据。
当通过转换把B1表中数据抽取到A1表时,会出现错误,这时批量会出现中断,后面的数据则不会插入到A1表中。
如果通过“定义错误处理”手机可以跳过错误,确保后面的数据可以插入到A1中,则证明此方案可行。
2.创建转换及设置
创建转换,在核心对象中选择“输入”→“表输入”,拖拽到转换中。
如图:
设置“表输入”并“确定”,“表输入”参数如下图所示:
以上SQL语句的作用是保证错误数据在数据集中间。
SQL语句如下:
SELECT * FROM QUICK_LOAN.B1 ORDER BY B ASC
在核心对象中选择“输出”→“表输出”,拖拽到转换中,将“表输入”与“表输出”连接。
设置“表输出”并“确定”,“表输出”参数如下图所示:
保存新建转换,如下图所示:
运行转换1,报错!如下图所示:
查看A1表并未插入数据,如下图所示:
在核心对象中选择“输出”→“表输出”,拖拽到转换中,将“插入到A1表”与“表输出”连接,选择“错误处理步骤”。如下图所示:
在“插入到A1表”上点击右键,选择“定义错误处理…”,如下图所示:
在“步骤错误处理设置”窗口中进行设置,并点击“OK",如下图所示:
errorNum、errorDesc、errorName、errorCode的名字必须与C1表中的字段一致!!!
设置“表输出”并“确定”,“表输出”参数如下图所示:
在核心对象中选择“流程”→“空操作(什么了不做)”,拖拽到转换中,将“插入到A1”与“空操作(什么了不做)”连接,选择”主输出步骤“。如下图所示:
在弹出的对话框中选择”分布“。如下图所示:
保存此转换!!!!并运行转换!!!!最终运行成功!!!
查询A1表数据,错误的数据没有插入到A1表中。如下图所示:
查询C1表数据,如下图所示:
从B1表向A1表抽取插入数据时,报错的数据都会存入C1。
C1中会记录出错数据的主要字段,也会记录kettle返回的异常信息字段如”ERRORDESC“。
至此解决方法成功执行。