2013-03-30 103 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