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) は Class (?extends Partitioner) に変換できません」というエラーが表示
されます。

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 に答える