這篇文章主要講解了“MapReduce默認(rèn)分區(qū)Hash Partitioner怎么使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“MapReduce默認(rèn)分區(qū)Hash Partitioner怎么使用”吧!
黃石港ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
1,mapreduce默認(rèn)的分區(qū)方式
默認(rèn)分區(qū)的源碼
public int getPartition(K2 key, V2 value,int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;}
key.hashCode(),是對map輸出的key取hashCode值
&是java中與運(yùn)算符,即按照二進(jìn)制的理解就是同為1則1,否則為0
Demo:
public class test{
public static void main(String[] args){
int a = 129
int b = 128
System.out.println(a&b); // 128
}
}
/*
解析:
"a"是129,轉(zhuǎn)換成二進(jìn)制是:10000001
"b"是128,轉(zhuǎn)換成二進(jìn)制是:10000000
按照&與的特性:
1與1為1
1與0為0
so,結(jié)果:10000000 即128
*/
所以,key.hashCode()&Integer.MAX_VALUE是要保證任何map端輸出的key與numReduceTashs取模后決定的分區(qū)為正整數(shù)
2,常見數(shù)據(jù)的hashCode值
1,int類型的數(shù)值
public void test(){ for ( int i = -3 ; i <=3 ; i++ ){ System.out.println(((Integer)i).hashCode) }}/*-3-2-10123*/
由此可見,對于int數(shù)據(jù)而言,它的hashCode值就是其包裝類型Integer本身,也有正負(fù)之分。
2,解決int類型數(shù)據(jù)hashCode值取模出現(xiàn)負(fù)數(shù)而影響分區(qū)的方式
public void test(){ for ( int i = -3 ; i <= 3 ; i++){ int n = (Integer(i)).hashCode(); System.out.println( n & Integer.MAX_VALUE); }}/*2147483645214748364621474836470123*/
由此可見,hashCode值如果是負(fù)數(shù)的話,可以對其與Integer.MAX_VALUE按位運(yùn)算,之后其結(jié)果變成**正數(shù)**
3,字符類型的hashCode值
public void test(){ for(int i = (int)'a'; i<=(int)'a'+25;i++ ) { String str = String.valueOf((char)i); System.out.print((char)i+"->"+str.hashCode()+"\n");}/*a->97b->98...x->120y->121z->122*/
由此可見,英文a->z或A->Z的hashCode值就是其對應(yīng)的整型數(shù)值
感謝各位的閱讀,以上就是“MapReduce默認(rèn)分區(qū)Hash Partitioner怎么使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對MapReduce默認(rèn)分區(qū)Hash Partitioner怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!