2013-05-18 6 views
5

最近、私はhadoopの決定的なガイドを読んでいます。 私は2つの質問があります。Text.hashCode()とInterger.MAX_VALUEはどういう意味ですか?

1.Iは、1つのカスタムパーティショナのコードの一部を見た:

public class KeyPartitioner extends Partitioner<TextPair, Text>{ 

    @Override 
    public int getPartition(TextPair key, Text value, int numPartitions){ 
     return (key.getFirst().hashCode()&Interger.MAX_VALUE)%numPartitions; 
    } 
} 

ことが& Integer.MAX_VALUEのために何を意味するのでしょうか?なぜ&を使用するのですか?

2.私はIntWritable用のカスタムパーティショナーも作成します。それでは、key.value%numPartitionsは直接問題なくOKです。

+1

'&'ビット単位のANDです。 – Maroun

+0

@MarounMarounはい、私は知っていますので、ハッシュコードをmax_value以下に保つためにhashcodeをmax_valueに使用していますか? – JoJo

+0

否定的なパーティションは明らかにナンセンスなので、正の値にしておきます。 –

答えて

11

すでにコメントに書いてあるように、結果の整数を正の値に保つために使用されます。

のは、文字列を使用して簡単な例を使ってみましょう:

String h = "Hello I'm negative!"; 
int hashCode = h.hashCode(); 

hashCode-1937832979の値が負です。

modこれには、パーティションを示す正の数(> 0)を使用すると、結果の数値は常に負になります。

System.out.println(hashCode % 5); // yields -4 

パーティションは負の値になることはありませんので、数値が正であることを確認する必要があります。 Integer.MAX_VALUEには符号ビット(ビッグエンディアンのようにJavaのMSB)を実行させるため、ここでは負の数に1つしかないので、ここでは単純なビットツイデッリンクのトリックがあります。

符号ビットを負の数に設定した場合は、常にANDになり、常に0になるInteger.MAX_VALUEのゼロが入ります。

あなたはしかし、それをより読みやすくすることができます。たとえばI have done that in Apache Hama's partitionerについては

return Math.abs(key.getFirst().hashCode() % numPartitions); 

を任意のオブジェクトのために:

@Override 
public int getPartition(K key, V value, int numTasks) { 
    return Math.abs(key.hashCode() % numTasks); 
} 
+2

クールな説明!私の側から+1。 –

関連する問題