sqoop把数据导入hive的一些问题记录

最近接了一个任务,需要把mysql的数据迁移到hive中,决定采用sqoop工具进行数据导入。
有很多解决方法都是参考其他博主的,但是忘记保存原文链接了。。。。

sqoop导入hive表示例命令:

sqoop import  \
--connect jdbc:mysql://192.168.1.90:3306/test?tinyInt1isBit=false \
--username $username  \
--password  $password  \
--table person  \
--num-mappers 2 \
--delete-target-dir \
--hive-drop-import-delims \
--fields-terminated-by "\001" \
--hive-import \
--hive-overwrite \
--null-string '\\N' \
--null-non-string '\\N'  \
--hive-table test.person
1、在mysql是空的字段,导入hive表后变成了 ‘NULL’ 的一个字符串值;
解决方式:
sqoop默认将mysql中的NULL空值导入到hive表时变成了null字符串在sqoop命令加入以下参数,可以实现将null转变为真正的NULL值。
--null-string '\\N' 
--null-non-string '\\N' 
2、mysql的字段是数字,导入hive表后变成布尔类型
解决方式:
jdbc会把tinyint 认为是java.sql.Types.BIT,然后sqoop就会转为Boolean了。
在连接时,在jdbc连接上加上一句话,
tinyInt1isBit=false

如:

connect jdbc:mysql://127.0.0.1:3306/test?tinyInt1isBit=false
3、导出mysql的datatime格式后面多了个.0
解决方式:
将MySQL datetime类型的数据,在创建hive表时,创建为timestamp类型就可以了。

hive支持的时间数据类型可以为String,date,timestamp。
在sqoop参数下面把需要去掉.0的时间列添加一个强制转换的参数,如有多个,加逗号。

--map-column-hive "gmt_create=timestamp,gmt_modify=timestamp" \

注意:如果已经同步过得表,想要解决这个问题需要把hive下的这个表删掉才可以生效。否则不生效

如果hive表的字段不能改成timestamp,只能导入后对hive表查询该字段的时候通过以‘.’分割字段值,然后取前面部分,如 "2020-11-10 12:12:42.0”,后面就变成了"2020-11-10 12:12:42”

4、使用import时,报错hive目录已存在;

解决方式:
如果在sqoop导入到一半被中断了,那么再一次运行这个import任务是会包失败的;
因为sqoop的底层就是使用mapreduce,而mapreduce运行过程中是要保证输出目录是不存在的才行,使用再运行sqoop前,删除mapreduc的输出目录就行了:
添加参数:

--delete-target-dir \

有遇到其它问题持续更新。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值