踩坑——Sqoop报错ERROR tool.ExportTool: Error during export

【踩坑——Sqoop报错ERROR tool.ExportTool: Error during export】@羲凡——只为了更好的活着
踩坑——Sqoop报错ERROR tool.ExportTool: Error during export 控制台打印的报错是

19/04/19 20:17:09 ERROR mapreduce.ExportJobBase: Export job failed! 19/04/19 20:17:09 ERROR tool.ExportTool: Error during export: Export job failed! at org.apache.sqoop.mapreduce.ExportJobBase.runExport(ExportJobBase.java:445) at org.apache.sqoop.manager.MySQLManager.upsertTable(MySQLManager.java:145) at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:73) at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:99) 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)

画龙点睛:遇到这个报错说明你的mysql和hive的字段不对应或者数据格式有出入
解决思路:
第一步:完整的检查mysql和hive表的结构(字段名称和数据类型)是否一致。
第二步:查看数据有没有导入?如果数据没有导入,请在检查第一步操作,可以将mysql和hive中的时间类型都改成string或varchar类型试一下。如果有导入,但是导入的数据不全或者不对。说明肯定是你的数据类型和实际的数据不一致。下面分两种情况。详见以下三步。
第三步:在mysql到hive中,请务必检查你的数据中是否包含hive建表默认的换行符 \n(LINES TERMINATED BY '\n’)。如果有,则sqoop语句中加上 hive-delims-replacement 或者 hive-drop-import-delims,如下代码
#!/bin/bash /usr/local/package/sqoop-1.4.7.bin/bin/sqoop import \ --connect jdbc:mysql://ip:3306/mysql_DB \ --username root \ --password 1q2w3e4r \ --table mysql_Table \ --delete-target-dir \ --hive-delims-replacement , \ --hive-import \ --hive-overwrite \ --hive-database hive_DB \ --hive-table hive_Table \ --hive-partition-key ymday \ --hive-partition-value 20190419 \ --fields-terminated-by '\t' \ -m 1

第四步:在mysql到hive中,请务必检查你的数据中是否包含hive建表常用的字段分隔符 \t(FIELDS TERMINATED BY '\t’)。如果有,则sqoop语句中 fields-terminated-by 参数不能用 \t,代码如下图
踩坑——Sqoop报错ERROR tool.ExportTool: Error during export
文章图片

第五步:在hive到hive中,如果有很多空列,有时也会报如上错误,则sqoop语句中加上 input-null-string 和 input-null-non-string,如下代码
切记^A,在linux的vi中用Ctrl+v 和Ctrl+a 生成,不能直接拷贝下面的^A
切记^A,在linux的vi中用Ctrl+v 和Ctrl+a 生成,不能直接拷贝下面的^A
切记^A,在linux的vi中用Ctrl+v 和Ctrl+a 生成,不能直接拷贝下面的^A
#!/bin/bash /usr/local/package/sqoop-1.4.7.bin/bin/sqoop export \ --connect "jdbc:mysql://ip:3306/report_db?useUnicode=true&characterEncoding=utf-8" \ --username root \ --password 1q2w3e4r \ --table mysql_table \ --columns name,age \ --update-key name \ --update-mode allowinsert \ --input-null-string '\\N' \ --input-null-non-string '\\N' \ --export-dir "/hive/warehouse/dw_db.db/hive_table/ymday=20190419/*" \ --input-fields-terminated-by '^A' \ -m 1

====================================================================
@羲凡——只为了更好的活着
若对博客中有任何问题,欢迎留言交流

    推荐阅读