在使用sqoop導出數據的時候出現了這種報錯。
20/08/27 15:03:05 ERROR 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:931)
at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:80)
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)
sqoop的shell命令是這樣的
sqoop export \
--connect jdbc:mysql://cdh00:3306/airquality \
--username root \
--password root \
--table co \
--export-dir hdfs://cdh01:8020/user/hive/warehouse/co \
--input-fields-terminated-by '\001' \
這里的錯誤就是經典的hive和mysql的表結構不對應,有可能你的實際情況和我不一樣,但是按照這個思路去檢查會很輕松找到你的問題根源。
這個問題是sqoop把你的數據往mysql中塞的時候格式不符,他就會返回這個錯誤。處理方式首先就應該檢查兩個表結構是否一致。
hive表結構查詢
desc [表名];
在檢查后我發現兩個表結構是完全一致的,也有可能是hive的分隔符弄錯了(–input-fields-terminated-by ‘\001’),檢查后也沒有問題,hive中確實使用默認的’\001’作為分隔符,那為什么會報錯嘞?
除了hive表結構之外,我們再檢查一下hive的數據,在hdfs/user/hive/warehouse/co中,可以在linux中hadoop fs -cat /user/hive/warehouse/co查看,為了方便我這里選擇在windows中下載查看。
數據節選
201501122002A\N2.105
//我的數據除了前兩條是string,后面都是double類型。
可以看到分隔符確實是"\001",但是double數據中有一個突兀的"\N"。原來是因為hive中的null值默認是按照字符串"\N"存儲的,所以在獲取數據時出現字符串"\N",而"\N"是字符串格式不符合double類型導致報錯。
這里有兩種處理方法,一種是將表結構統一改成varchar類型,但是這樣"\N"就按照字符串存入了,不方便處理。所以加上兩條參數–input-null-string和–input-null-non-string,在sqoop遇到"\N"后按照null進行插入處理。
修改后的sqoop命令
sqoop export \
--connect jdbc:mysql://cdh00:3306/airquality \
--username root \
--password root \
--table co \
--export-dir hdfs://cdh01:8020/user/hive/warehouse/co \
--input-fields-terminated-by '\001' \
--input-null-string '\\N' \
--input-null-non-string '\\N'
