通過Sqoop將Oracle中表導入到HDFS時報錯Error during import: No primary key could be found

       我的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章