我的Sqoop版本是1.4.6,在利用Sqoop將Oracle數據導入到HDFS時候回出現一些異常,因此我們我們要注意以下幾點:
sqoop import --connect jdbc:oracle:thin:@192.168.8.110:1521:orcl --table TRANS_GJJY02 --username sky --password 123456 -m 8 --target-dir /usr/input/
錯誤:ERROR tool.ImportTool: Error during import: No primary key could be found for table TRANS_GJJY02. Please specify one with --split-by or perform a sequential import with '-m 1'.
根據錯誤提示我們可以知道這是因爲Oracle表中的數據沒有設置主鍵。而針對這個問題有兩種傑解決方案:
方案一:老老實實地在Oracle表中設置主鍵,然後再執行這個導入語句,就不會出錯。
方案二:有些數據無法設置主鍵,比如很多的監測記錄數據,找不到唯一值,針對這種數據,我們可以根據上面的錯誤提示通過以下兩個方法來解決:
(1)將你的map個數設置爲1(Sqoop默認是4),命令如下:
sqoop import --connect jdbc:oracle:thin:@192.168.8.110:1521:orcl --username sky --password 123456 --table TRANS_GJJY02
--target-dir /user/sky/data --columns "IC_CARDNO,IC_TIME,IC_AMOUNT,IC_TYPE,ICLINE_NO,ICDEVICE_ID,VEHICLE_ID" -m
1
(2)使用--split-by,後面跟上表的最後一列名字。從而能夠對數據進行分行 ,命令如下:
sqoop import --connect jdbc:oracle:thin:@192.168.8.110:1521:orcl --username sky --password 123456 --table TRANS_GJJY02
--target-dir /user/sky/data --columns "IC_CARDNO,IC_TIME,IC_AMOUNT,IC_TYPE,ICLINE_NO,ICDEVICE_ID,VEHICLE_ID" --
split-by VEHICLE_ID
這兩種解決方法,推薦使用方法(2),因爲方法(1)只用一個map,效率太低,相比較而言,方法(2)可以自己設置map個數,效率會高一些。
參考資料:http://stackoverflow.com/questions/29138498/sqoop-import-without-primary-key-in-rdbms