使用Sqoop重Mysql往Hive迁移数据时出现数据错位(NULL字符串)

使用Sqoop重Mysql往Hive迁移数据时出现数据错位(NULL字符串)

如图:

在这里插入图片描述
出现这种原因是因为指定的“分隔符”造成的:
Hive的数据显示机制:
存储在Hive中的数据除去硬盘数据最终是落脚在HDFS上,Hive依赖HDFS存储数据,Hive并不直接存储数据。所以在我们创建一张普通Hive表时,我们可以通过指定“行/列分隔符”,如下表:
create table book_url_config(id int,url string,type int,title string,content string,price double,author string,source string,review int,collect int,book_img string,update_time timestamp)row format delimited fields terminated by ‘\t’;
此处我通过row format delimited fields terminated by ‘\t’指定book_url_config表的列分隔符为“\t”,在使用Sqoop往Hive迁移数据时指定数据行分隔符英文逗号
代码:
sqoop import
–hive-import
–hive-table book_url_config
–hive-overwrite
–hive-drop-import-delims
–fields-terminated-by ‘,’
–target-dir /tmp/e2
–connect jdbc:mysql://xxx.xxx.xxx.xxx:3306/meishi
–username xxx
–password xxx
–table book_url_config
–split-by id
-m 2
如此情况:
因为我们迁移数据时指定Sqoop按照’,‘来拆分数据若Mysql数据库中某个字段内容中包含了’,‘则Sqoop会默认去做一次拆分,若Mysql字段内容中有多个Sqoop拆分符,则Sqoop会进行多次拆分,并将拆分过后的数据按照’,‘作为分隔符存放在Hive指定的HDSF目录中,这样就会存在一个问题,我们定义的Hive表字段是有限的,假如我们定义的Hive表只有5个字段,而重Sqoop往Hive迁移数据时根据Sqoop拆分出来的某条数据有10个字段,那么原Hive表根本就存不下这么多数据,且Hive表我们定义的分隔符为’\t’当Hive表拿着Hive定义的分隔符’\t’去HDFS上解析数据到Hive表显示时若存放在HDFS上数据存在多个’\t’Hive就会根据’\t’的出现的位置依次解析数据到Hive表相应的字段中去,故会出现上图中多个NULL值且数据错位的情况。

使用Sqoop(Sqoop指定分隔符为’,’)往Hive迁移数据时数据在HDFS上的格式:存储在HDFS上的数据按照Sqoop指定的分隔符来进行排列:

在这里插入图片描述

解决上面的情况通过修改Hive建表时指定列分隔符与Sqoop拆分符一致即可
但要注意不要与Hive默认的列分隔符有冲突!!!尽量保证列分隔符的唯一性(分隔符不要与Mysql数据库中字段内容起冲突)!!!。
如下修改Hive建表时的列分隔符:
create table book_url_config(id int,url string,type int,title string,content string,price double,author string,source string,review int,collect int,book_img string,update_time timestamp)row format delimited fields terminated by ‘,’;

效果:
在这里插入图片描述
备注:
–hive-drop-import-delims
Drops \n, \r, and \01 from string fields when importing to Hive.

文章有很多不足的地方,请指正一定虚心接受,一同进步,谢谢。
------钗头凤

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值