通过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

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