2016-04-15 34 views
0
HashPartitioner<Text,Text> hash=new HashPartitioner<Text,Text>(); 

@Override 
public int getPartition(CompositeKeyClass keyClass, Text valClass, int numOfPartition) { 
    // TODO Auto-generated method stub 
    try {  
     String[] type=valClass.toString().split(","); 

     if(type[0].equals("Mapper1")) { 
      return (hash.getPartition(keyClass.getFirst(), valClass, numOfPartition))%numOfPartition; 
     } else { 
      return (hash.getPartition(keyClass.getFirst(), valClass, numOfPartition))%numOfPartition; 
     } 
    } 
} 

我在分區程序類中使用上述代碼來獲取我的自定義類的密鑰。所有的工作正常,但我希望有文本「Mapper1」的值發送到第一個減速器,另一個發送到第二個。我怎樣才能做到這一點?我已將job.numOfReduceTaks設置爲2.請幫助!如何在自定義密鑰的情況下爲自定義分區程序設置numReduceTask

回答

2

這是一個靜態決定吧? 試試這個:

if (type[0].equals("Mapper1")) { 
    return 0; 
} else { 
    return 1; 
} 

是的,在驅動程序,您需要設置job.numOfReduceTaks 2。你們這樣做是正確的。

+0

如何返回getPartition方法呢?它需要與關鍵類一起返回以便將正確的關鍵字發送給reducer。 –

+0

@AmardeepSingh好吧,我沒有得到你想說的話。您的getPartition()方法只需要返回一個int(即0 <=分區號

+0

基本上我使用自定義鍵類的自定義分區程序。如果只有一個Reducer,以下代碼可以工作。我需要如何設置,以便在需要兩臺減速機時處理這種情況?內聯「\t公共靜態類分區擴展分區程序 \t { \t \t \t 私人\t HashPartitioner 散列=新HashPartitioner (); \t \t @覆蓋 \t \t公衆詮釋getPartition(CompositeKey鍵,文字VAL,INT NUM){ \t \t \t \t回hash.getPartition(key.getFirst(),VAL,NUM)%NUM; \t \t} \t \t \t}' –