2013-03-30 74 views
0

我写我自己的自定义分区程序(旧的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)不能转换为类
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) { 

    } 
} 
+0

感谢的人!我不知道我怎么忘了修改标题..感谢具体的答案...我混合了旧的和新的api的.. :) – JackSparrow

2

除了阿马尔的答案,你应该处理的hashCode的可能性由位掩码返回一个负数:

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

谢谢克里斯...当然,我会照顾这一点。 – JackSparrow