2013-05-18 177 views
5

最近,我正在閱讀hadoop的權威指南。 我有兩個問題:這對Text.hashCode()和Interger.MAX_VALUE有什麼意義?

1.I看到一塊一個自定義分區程序代碼:

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?

+1

'&'是按位與。 – Maroun

+0

@MarounMaroun是的,我知道,所以他們使用散列碼和max_value保持散列碼低於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它的Integer.MAX_VALUE零將始終爲零。

你可以儘管它更易讀:

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

例如I have done that in Apache Hama's partitioner對任意對象:

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

酷解釋! +1從我身邊。 –