ETL工具Kettle基本用法——Kettle数据同步时将空字符串当做NULL传递问题的解决

转载请注明出处:http://blog.youkuaiyun.com/dongdong9223/article/details/80919323
本文出自【我是干勾鱼的博客

在前在ETL工具Kettle基本用法——Kettle的安装中介绍了如何正确Kettle。

使用Kettle进行数据同步时会有个问题,那就是默认情况下,Kettle会将源数据库表字段中的空字符串,也就是2个单引号:

当做:

NULL

传递到目的数据库表的字段中。拿MySQL举例来说,比如有2个数据库:

k1
k2

每个数据库里都有1张表:

user

k1.user与k2.user的字段完全一样,都是:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_name` varchar(45) NOT NULL DEFAULT '' COMMENT '用户名', 
  `phone_id` varchar(200) NOT NULL DEFAULT '' COMMENT '手机登录后绑定的唯一标识',  
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=203 DEFAULT CHARSET=utf8 COMMENT='系统用户表';

表k1.user,还插入了1条数据:

INSERT INTO `user` VALUES (1,'admin','');

表k2.user是空表,没有数据。

这个时候如果要使用Kettle将k1.user表中的数据插入到k2user中,Kettle会报错:

Column 'phone_id' cannot be null

这是因为Kettle默认情况下把空字符串当作NULL处理!

解决的办法就是找到文件:

C:\Users\用户名.kettle\kettle.properties

在其中加入内容:

KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL=Y

然后重启Kettle就可以了!

参考:关于kettle的空字符串和NULL的问题

Kettle的Java代码中判断字符串,通常会使用Java标准的字符串判断方法,并结合Kettle的字段处理机制来确保数据的一致性和准确性。Kettle在处理字段,尤其是在ETL过程中,会对字符串和`NULL`进行区分,具体行为可以通过配置`kettle.properties`文件中的参数来控制,例如避免将字符串自动转换为`null`[^3]。 ### 判断字符串的方法 1. **使用Java标准方法判断字符串** 在Java代码中,可以直接使用`String.isEmpty()`方法来判断字符串是否为。该方法返回`true`当且仅当字符串长度为0。 ```java String value = ...; // 从Kettle的字段中获取的值 if (value != null && value.isEmpty()) { // 处理字符串的情况 } ``` 2. **结合Kettle字段处理判断字符串** 如果是从Kettle的`RowMetaInterface`和`Object[]`中获取字段值,则需要确保字段类型为字符串,并进行值处理: ```java int index = rowMeta.indexOfValue("your_field_name"); if (index >= 0 && rowMeta.getValueMeta(index).getType() == ValueMetaInterface.TYPE_STRING) { String fieldValue = (String) rowMeta.getValueMeta(index).getString(row[index]); if (fieldValue != null && fieldValue.isEmpty()) { // 处理字符串的情况 } } ``` 3. **考虑Kettle的环境配置** 在某些情况下,Kettle可能会根据`kettle.properties`中的配置将字符串转换为`null`。为了避免这种情况,可以在配置文件中添加以下参数: ```properties KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL=Y ``` 这样可以确保字符串不会被误判为`null`,从而在Java代码中能更准确地进行判断[^3]。 ### 示例:在Kettle插件中判断字符串 以下是一个完整的示例,展示如何在Kettle插件或Java集成代码中判断字符串: ```java public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException { Object[] row = getRow(); if (row == null) { setOutputDone(); return false; } RowMetaInterface inputRowMeta = getInputRowMeta(); int index = inputRowMeta.indexOfValue("your_string_field"); if (index >= 0) { String fieldValue = inputRowMeta.getString(row, index); if (fieldValue == null) { logBasic("Field is NULL"); } else if (fieldValue.isEmpty()) { logBasic("Field is an empty string"); } else { logBasic("Field value: " + fieldValue); } } putRow(inputRowMeta, row); return true; } ``` ### 注意事项 - 在Kettle中,字符串和`NULL`的处理方式可能不同,尤其是在与数据库交互。例如,MySQL会将字符串和`NULL`视为不同的值,因此在ETL过程中必须明确区分。 - 如果使用JavaScript组件(如“JavaScript”步骤),可以直接使用`typeof`和`=== ""`来判断字符串,如下所示: ```javascript var fieldValue = row.getValue("your_field_name"); if (fieldValue === "") { // 处理字符串 } ``` 这种方式适用于Kettle内置的JavaScript脚本编写场景[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值