用Sqoop导hive数据到Mysql,遇到的坑(hive存储格式导出 的坑)

sqoop导hive数据踩过的坑

工作中涉及到需要通过hive把存储在HDFS上的数据迁移到MySQL,其实只说这个,在网上搜索一下,大把的帖子告诉你怎么做。 但是却没有一个适合我的,最后听别人的一句提示,才解决。满满的心酸呐........


前言

虽说现在Apache在6月份已经终止了Sqoop项目,但是Sqoop目前在公司还算挺火热的吧,公司暂时还谈不上淘汰它。

一、先来了解下Sqoop

Apache Sqoop是一种用于Apache Hadoop和结构化数据存储(如MySQL、)之间高效传输批量数据的工具。我们可以使用Sqoop将数据从外部数据结构存储导入到Hadoop分布式文件系统或相关系统,如Hive、HBase。相反,Sqoop也可用于从Hadoop中提取数据并将其 导出 到外部结构化数据存储,例如,关系型数据库、企业数据仓库。

二、踩到的坑

1. Hive中存储的表

  • 学生信息表
create table test1 (
id STRING
,name STRING
,age STRING
,id_card STRING
) AS PARQUET COMMENT '学生信息表'
  • 学生成绩表
create table test2 (
id STRING
,name STRING
,math_score decimal(16,2)
,english_score decimal(16,2)
) AS PARQUET COMMENT '学生成绩表'
  • 学生宽表
create table test3 (
id STRING
,name STRING
,age STRING
,id_card STRING
,math_score decimal(16,2)
,english_score decimal(16,2)
) AS PARQUET COMMENT '学生宽表'

如下:

要求,将test1 和 test2合并成一张宽表,并且导入到MySQL中。如test3所示。 本来是很简单的一件事,只需要: test1

insert overwrite[into] table test3
select
id, name, id_card, math_score, english_score
from
test1 t1
left join
test2 t2
on t1.id = t2.id

执行到这里,还不会报什么错。(当时我是这样)

2. mysql创表

create table test3 (
id varchar(255)
,name varchar(255)
,age varchar(255)
,id_card varchar(255)
,math_score decimal(16,2)
,english_score decimal(16,2)
)
这里表我是原样复制过来的,只是把STRING -> varchar。不存在 【类型不一致】问题

3. sqoop命令把hive表数据导入MySQL

代码如下(示例):

sqoop export \
--connect 10.10.12.11 \
--username=user \
--password=password \
--table test3 \
--export-dir /user/hive/warehouse/tmp.db/test3 \ --如果hive表有分区,这里可以加上分区
--fields-terminated-by "\\001"' \
--update-mode allowinsert \
--input-null-string \\\\N \
--input-null-non-string \\\\N

4. 报错

存储格式导致

提示:
如果你发现hive表数据类型 和 mysql表数据类型一样,并且很确定,那你可以向 【hive的存储格式上】想想

当你发现linux下执行报错了,linux下显示出来的只是精简的报错。【我遇到的报错linux跟yarn输出的就不一致,但都是同一个问题导致的,这个毋庸置疑】
所以我们要把yarn的日志输出出来:
命令:yarn logs -applicationId application_id > 1.txt
输出到一个文件中,方便我们查看错误,当然也可以直接输出到屏幕上。

直接编辑输出的文件,定位到错误,就是上面报错的图片

当你确定类型一致时,看下hive的存储格式;
就像上面一样,hive中的存储格式是parquet,是会压缩的。用Sqoop导出时,个人判断是 hive压缩导致的,事实也确是如此。
hive的parquet格式数据直接导入mysql,会报 java.lang.ClassCastException 异常

把test3的存储格式由【parquet】改为 【testfile】,完美解决问题
testfile在hive中是原样存储的,不进行任何多余操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值