Ошибка пользовательского разделителя
Я пишу свой собственный 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;
}