Ошибка пользовательского разделителя

Я пишу свой собственный 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) не может быть преобразован в класс (расширяет Partitioner).
2. Это правильный способ написать пользовательский разделитель или мне нужно переопределить некоторые другие функции?

2 ответа

Решение

Я полагаю, что вы путаете старый 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) {

   }
}

В дополнение к ответу Амара вы должны обработать случайность hashCode, возвращающего отрицательное число с помощью маскировки битов:

@Override
public int getPartition(WordPair wordPair, IntWritable intWritable, int numPartitions) {
    return (wordPair.getWord().hashCode() % numPartitions) & 0x7FFFFFFF;
}
Другие вопросы по тегам