自定义分区程序错误

bxgwgixi  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(354)

我正在编写自己的自定义分区器(旧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我得到错误:“实际参数类(wordpairpartitioner)无法转换为类(?extends partitioner)。
2这是编写自定义分区器的正确方法还是我也需要重写其他一些功能?

xdyibdwo

xdyibdwo1#

除了amar的答案之外,您还应该处理哈希代码按位屏蔽返回负数的可能性:

@Override
public int getPartition(WordPair wordPair, IntWritable intWritable, int numPartitions) {
    return (wordPair.getWord().hashCode() % numPartitions) & 0x7FFFFFFF;
}
anauzrmj

anauzrmj2#

我相信你混淆了旧的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) {

   }
}

相关问题