sqoop入hdfs出现No primary key could be found forXX的问题记录
- 614 次检阅

如果使用过sqoop工具,把关系型数据库(ORACLE/Mysql)的数据导入到hdfs时,应该也会出现一些问题..如果还不知道的话,可以先到http://199604.com/1102( sqoop的简单用法),我这篇文章简单入门。


最近,出现最多的问题,应该是报这个错-->

ERROR tool.ImportTool: Error during import: No primary key could be found for table IOT_DIG_CAT_COUNT_BAK_1904. Please specify one with --split-by or perform a sequential import with '-m 1'.

从报错的信息提示可以看出,他表示您这个表找不到主键,需要我们使用把--split-by或者把参数-m设置为1。

 从这个报错的信息里,其实也可以深入聊一下,就是 --split-by与-m的关系(小白开发也可以是垃圾开发,我写的你们最好别信):

1.split-by 根据不同的参数类型有不同的切分方法,如int型,Sqoop会取最大和最小split-by 字段值,然后根据传入的-m(--num-mappers)来确定划分几个区域。比如select max(id),min(id) from得到的max(id)和min(id)分别为1000和1,而这时--num-mappers(-m)为2的话,程序就会分成两个map的区域,(1,500),(501-1000),同时也会分成2个sql给2个map去进行导入操作,其实就是分页查询...sql类似 select xxx字段 from queryTableName wher id >=1 and id <=500,后面的sql省略..然后你-m的2个map就去执行这两个sql。

2.这个问题,应该也很常见,因为我先在公司,很多表都是无主键的,所以有时候split-by 字段不是int(number)类型,我解决的办法就是最无奈的办法了,只能用一个map 去执行,split-by不设置。时间效率就慢了下来吧。ps:当-m 设置的值大于1时,split-by必须设置字段

3.如果split-by 设置的字段是int(number)类型,但是呢,你的数字不是连续的..这种情况有可能会造成 一些map执行数量比较多,一些比较少,从而造成了某些map消耗时间非常久,一些马上执行完的情况,造成数据倾斜有可能报错...

好了,根据这个解释,应该都知道,报这个错,怎么解决了吧...end,睡个漂亮的午休...


分享到:
, ,

这篇文章还没有评论

发表评论