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