2016-04-15 10 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; 
     } 
    } 
} 

上記のコードをPartitionerクラスで使用してカスタムクラスのキーを取得しています。すべて正常に動作しますが、テキスト "Mapper1"が最初のレデューサーに送信され、もう1つが2番目に送信された値が必要です。それをどうすれば実現できますか?私はjob.numOfReduceTaksを2に設定しました。助けてください!カスタムキーの場合にカスタムパーティショナーのnumReduceTaskを設定するには

答えて

2

これは静的な決定権ですか? これを試してみてください:

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

そして、はい、ドライバーにあなたは右のそれをやったjob.numOfReduceTaks 2に設定する必要があります。

+0

どうすればgetPartitionメソッドを返すことができますか?レデューサーに適切なキーを送るには、キークラスで返す必要があります。 –

+0

@AmardeepSinghまあ、私はおそらくあなたが言うことを得ていない。 getPartition()メソッドは単にint(つまり、0 <=パーティション番号

+0

基本的に私はカスタムキークラスのカスタムパーティショナー。次のコードは、Reducerが1つだけの場合に機能します。 2つのレデューサーが必要な場合にどのように対応できるようにするにはどうすればよいですか?インライン '\tパブリック静的クラスパーティションはパーティション分割 \t { \t \t \t \tプライベートHashPartitioner ハッシュ=新しいHashPartitioner ()を拡張します。 \t \t @Override \t \t公共INT getPartition(CompositeKeyキー、テキストのVal、int型NUM){ \t \t \t \t戻りhash.getPartition(key.getFirst()、ヴァル、NUM)%のNUM。 \t \t \t \t \t} –

関連する問題