0

我正在编写自己的自定义 Partitioner(Old Api) 下面是我扩展 Partitioner 类的代码:

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. 我收到错误:“实际参数类 (WordPairPartitioner) 无法转换为类 (?extends Partitioner)
。2. 这是编写自定义分区器的正确方法,还是我还需要覆盖其他一些功能?

4

2 回答 2

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) {

   }
}
于 2013-03-30T12:24:45.483 回答
2

除了 Amar 的回答之外,您还应该处理 hashCode 通过位掩码返回负数的可能性:

@Override
public int getPartition(WordPair wordPair, IntWritable intWritable, int numPartitions) {
    return (wordPair.getWord().hashCode() % numPartitions) & 0x7FFFFFFF;
}
于 2013-03-30T14:16:44.993 回答