我正在编写自己的自定义分区程序(Old Api),下面是我扩展分区程序类的代码:
public static class WordPairPartitioner extends Partitioner<WordPair,IntWritable> {
@Override
public int getPartition(WordPair wordPair, IntWritable intWritable, int numPartitions) {
return wordPair.getWord().hashCode() % numPartitions;
}
}
设置JobConf:
conf.setPartitionerClass(WordPairPartitioner.class);
WordPair类包含:
私人文字;
私人文本邻居;
问题:
1.我收到错误:&#34;实际参数类(WordPairPartitioner)无法转换为Class(?extends Partitioner)。
2.这是编写自定义分区程序的正确方法还是我还需要覆盖其他一些功能?
答案 0 :(得分:3)
我相信你正在混淆旧的API(来自org.apache.hadoop.mapred.*
的类)和新的API(来自org.apache.hadoop.mapreduce.*
的类)
使用旧API,您可以执行以下操作:
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.Partitioner;
public static class WordPairPartitioner implements Partitioner<WordPair,IntWritable> {
@Override
public int getPartition(WordPair wordPair, IntWritable intWritable, int numPartitions) {
return wordPair.getWord().hashCode() % numPartitions;
}
@Override
public void configure(JobConf arg0) {
}
}
答案 1 :(得分:2)
除了Amar的答案之外,你应该处理hashCode通过位屏蔽返回负数的可能性:
@Override
public int getPartition(WordPair wordPair, IntWritable intWritable, int numPartitions) {
return (wordPair.getWord().hashCode() % numPartitions) & 0x7FFFFFFF;
}