分享

sqoop2导入导出null数据到mysql中

SuperDove 发表于 2016-9-27 20:53:52 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 10 26164
现有如下mysql表结构
create table users(
   user_id INT NOT NULL,
   name VARCHAR(20),
   age int,
   sex char,
   PRIMARY KEY ( user_id )
)ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

插入数据
insert into users(user_id,name,age,sex) values(1,'zcy',21,'男');
insert into users(user_id,name,age,sex) values(2,'张三',22,'男');
insert into users(user_id,name,age,sex) values(3,'李四',24,'男');
insert into users(user_id,name,sex) values(4,'小丽','女');---注意这里的小丽age为null


将users表的数据通过sqoop1.99.4导入到hdfs:/tmp/sqoop/下
报错如下
error.png
或者,将null数据导入到mysql中,对应到mysql中数据类型为int类型,也会报这样的错误,应该如何解决这样的错误?
求解

已有(10)人评论

跳转到指定楼层
starrycheng 发表于 2016-9-27 21:14:54
null你也要填入数据呀。
可以填写为0,但是你不能不填啊。
这是基本的常识了

还有数据类型要一致,否则报错很正常的。
回复

使用道具 举报

SuperDove 发表于 2016-9-27 21:17:58
starrycheng 发表于 2016-9-27 21:14
null你也要填入数据呀。
可以填写为0,但是你不能不填啊。
这是基本的常识了

问题就是现在有一堆需要处理的int类型数据的值就是null......有的时候就是前人处理数据不规范,后人遭殃啊

回复

使用道具 举报

SuperDove 发表于 2016-9-27 21:23:16
starrycheng 发表于 2016-9-27 21:14
null你也要填入数据呀。
可以填写为0,但是你不能不填啊。
这是基本的常识了

我想着既然小丽的age为空,我设置age空出来不设值为:4,'小丽',,'女'。但是sqoop从hdfs抽取数据的时候也报错,这个位置是空的也要有值,我就将这里赋值为NULL,结果为4,'小丽',NULL,'女'。
然后重新执行job就是null转变为number报错。
这种数据类型应该怎么解决才好



回复

使用道具 举报

starrycheng 发表于 2016-9-27 21:36:51
本帖最后由 starrycheng 于 2016-9-27 21:38 编辑
SuperDove 发表于 2016-9-27 21:17
问题就是现在有一堆需要处理的int类型数据的值就是null......有的时候就是前人处理数据不规范,后人遭殃 ...


sqoop目前还没有发现数据类型转换。
导入和导出的数据类型一致。

只能把age的数据类型,改成与原库一样的类型。而不是整形。这样就没问题了


回复

使用道具 举报

SuperDove 发表于 2016-9-27 22:08:02
starrycheng 发表于 2016-9-27 21:36
sqoop目前还没有发现数据类型转换。
导入和导出的数据类型一致。

哎,就是因为原库中的age为int类型,并且还default null,你说气不气。
不过你这么一说我想起另一个方法,做一个中间表然后倒入转换格式看看~~
回复

使用道具 举报

tntzbzc 发表于 2016-9-28 13:15:34
SuperDove 发表于 2016-9-27 22:08
哎,就是因为原库中的age为int类型,并且还default null,你说气不气。
不过你这么一说我想起另一个方法 ...

可以尝试如果为空返回0,否则返回1
select if(isnull(col),0,1) as col.

回复

使用道具 举报

SuperDove 发表于 2016-9-28 15:25:46
tntzbzc 发表于 2016-9-28 13:15
可以尝试如果为空返回0,否则返回1
select if(isnull(col),0,1) as col.

你说的这个select if(isnull(col),0,1) as col语句是写在哪里?sqoop:000> create job -f 3 -t 2
Creating job for links with from id 3 and to id 2
Please fill following values to create new job object
Name: test13
From Job configuration
Input directory: /tmp/download/data.txt
To database configuration
Schema name: zcy
Table name: users
Table SQL statement: ----是写在这里吗?我写的select if(isnull(age),0,1) as col也报错
Table column names: users,name,age,sex
Stage table name:
Should clear stage table:
Throttling resources
Extractors: 1
Loaders: 1


回复

使用道具 举报

tntzbzc 发表于 2016-9-28 16:46:57
SuperDove 发表于 2016-9-28 15:25
你说的这个select if(isnull(col),0,1) as col语句是写在哪里?sqoop:000> create job -f 3 -t 2
Creati ...

那就可能sqoop不支持了
回复

使用道具 举报

SuperDove 发表于 2016-10-17 19:37:30
问题经过一段时间整理,已解决,将CSVIntermediateDataFormat.java文件的206行对  "null".equals(fields[i])的情况做空值处理即可。
中间遇见的打包文件找不到等问题,同事帮忙找着了,感谢各位帮忙解决
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条