将hive中的表使用sqoop导出到mysql数据库中(报错与问题解决)

今天在hue上将数据统计了一下,然后需要导出到mysql中给别人进行展示。由于是第一次在这里导出数据,所以出了一些问题,这里总结一下解决思路与解决办法。

一、首先先在mysql中创建导出的表

这里要确认字段属性与hive中的一致。

CREATE TABLE `unperceived` (
  `humanid` varchar(50) NOT NULL,
  `credentialsnum` varchar(50) DEFAULT NULL COMMENT '用户学号或教职工号',
  `facepicurl` varchar(255) DEFAULT NULL COMMENT '人员照片',
  `credentialstype` int(10) DEFAULT NULL,
  `listlibid` int(10) DEFAULT NULL,
  `humanname` varchar(255) DEFAULT NULL COMMENT '姓名',
  `duty` varchar(255) DEFAULT NULL COMMENT '用户类型',
  `depart` varchar(255) DEFAULT NULL COMMENT '部门或专业',
  `type` int(10) DEFAULT NULL COMMENT '用户类型(1教职工:2学生)',
  `license` varchar(255) DEFAULT NULL COMMENT '车牌信息',
  `num` varchar(50) DEFAULT NULL,
  `gztime` varchar(50) DEFAULT NULL COMMENT '未感知的日期',
  `date_time` varchar(50)
)

二、导出数据表到mysql中

先看看这个表的文件存放路径:

然后我们通过sqoop来导出数据:

export --connect jdbc:mysql://xdata4:3306/jxcy_dpxs?characterEncoding=utf8 --username root --password P@ssw0rd4321 --table unperceived --fields-terminated-by "\001"  --input-null-string "\\N" --input-null-non-string "\\N" --export-dir /user/hive/warehouse/activemq_topic.db/unperceived/date_time=${date_time}
这里我们的数据表按照每天的日期来分区,所以需要外部传参 ${date_time} 来确定导出哪个文件,慢慢文件多了也好管理一些。并且可以写一个定时任务来每天导出一次数据。

三、export报错与解决步骤

这里执行报了第一个错,报错日志  Could not load db driver class: com.mysql.jdbc.Driver 如下:

2019-11-19 20:21:27,049 [main] INFO  org.apache.sqoop.manager.MySQLManager  - Preparing to use a MySQL streaming resultset.
2019-11-19 20:21:27,049 [main] INFO  org.apache.sqoop.tool.CodeGenTool  - Beginning code generation
2019-11-19 20:21:27,055 [main] ERROR org.apache.sqoop.Sqoop  - Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver

<<< Invocation of Sqoop command completed <<<

No child hadoop job is executed.
Intercepting System.exit(1)

<<< Invocation of Main class completed <<<

Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SqoopMain], exit code [1]

Oozie Launcher failed, finishing Hadoop job gracefully

这个很明显,就是缺少mysql的驱动文件,我点击齿轮按钮,在hdfs上选择对应的mysql驱动jar包:

然后再执行一次,报了一个新的错误,export: Export job failed! :

2019-11-19 20:24:28,436 [main] ERROR org.apache.sqoop.tool.ExportTool  - Error during export: 
Export job failed!
	at org.apache.sqoop.mapreduce.ExportJobBase.runExport(ExportJobBase.java:439)
	at org.apache.sqoop.manager.SqlManager.exportTable(SqlManager.java:930)
	at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:92)
	at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:111)
	at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
	at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
	at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
	at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
	at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
	at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
	at org.apache.oozie.action.hadoop.SqoopMain.runSqoopJob(SqoopMain.java:187)
	at org.apache.oozie.action.hadoop.SqoopMain.run(SqoopMain.java:170)
	at org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:81)
	at org.apache.oozie.action.hadoop.SqoopMain.main(SqoopMain.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:235)
	at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
	at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:459)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
	at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:415)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1924)
	at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

网上很多大神说因为hive表结构与mysql的表结构不一致,我也好好对了一下,然后果然发现一个问题,在hue中显示的unperceived表有date_time这个字段,所以我在mysql创建表时也添加了这个字段。但是这个字段是hive中按照日期分区时添加的,我们找到这个文件目录上,文件下载下来可以看到文件中并没有date_time这个字段,只是hue中显示了而已。

我们看mysql的表中:

所以找到了问题在哪,只要在mysql中将这个字段删掉就好了。

然后执行还是报错了,哎 一直在爬坑。

这个报错的一时解决不了,数据类型怎么对也都是一样的,然后我查看Hadoop的日志信息,在报错信息中找到选中的这个网址,打开:

然后在打开的页面中选择Failed下面的1:

然后我们打开可以看到这个报错信息。

终于知道了,因为这个统计的数据是每天所有未感知到的人员数据,所以学号会出现重复,而我在mysql中定义表时候将num这个字段定义为了主键,当然就不能执行了。这里将这个主键取消掉即可:

四、解决问题后执行导出

然后再导出看看,可以发现不报错了,导出成功:

打开mysql,看看这个表数据是否存在:

OK了,成功export,以后记住了。记录一下。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山孤客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值