我试图写一个代码,我可以自定义输入将根据字符的长度使用实现到默认Mapper和reducer所在的Partition来访问reducer,但下面的错误即将到来。我会感谢帮助我的人。
int setNumRedTasks)
:错误
名称冲突:类型的方法getPartition(Object,Object,int(MyPartitioner具有与的getPartition(K2,V2,int(相同的擦除键入Partitioner,但不覆盖它
代码:
package partition;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.Partitioner;
public abstract class MyPartitioner implements Partitioner<Text, IntWritable>{
@Override
public void configure(JobConf arg0) {
// TODO Auto-generated method stub
}
// @Override
public int getPartition(Object key, Object value, int setNumRedTasks) {
String s = key.toString();
if(s.length()==1)
{
return 0;
}
if(s.length()==2)
{
return 1;
}
if(s.length()==3)
{
return 2;
}
else
return 3;
}
}
您的getPartition
方法签名是错误的,它需要是:
public int getPartition(Text key, IntWritable value, int setNumRedTasks) {
... Code goes here
}
这个SO回答解释了擦除错误的含义:该方法与类型中的另一种方法具有相同的擦除
实际上,因为您使用了Object而不是泛型类型,所以无法确定使用哪个版本,所以它们是等效的。