这篇文章主要讲解了“MapReduce默认分区Hash Partitioner怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MapReduce默认分区Hash Partitioner怎么使用”吧!
1,mapreduce默认的分区方式
默认分区的源码
public int getPartition(K2 key, V2 value,int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;}
key.hashCode(),是对map输出的key取hashCode值
&是java中与运算符,即按照二进制的理解就是同为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,转换成二进制是:10000001
"b"是128,转换成二进制是:10000000
按照&与的特性:
1与1为1
1与0为0
so,结果:10000000 即128
*/
所以,key.hashCode()&Integer.MAX_VALUE是要保证任何map端输出的key与numReduceTashs取模后决定的分区为正整数
2,常见数据的hashCode值
1,int类型的数值
public void test(){ for ( int i = -3 ; i <=3 ; i++ ){ System.out.println(((Integer)i).hashCode) }}/*-3-2-10123*/
由此可见,对于int数据而言,它的hashCode值就是其包装类型Integer本身,也有正负之分。
2,解决int类型数据hashCode值取模出现负数而影响分区的方式
public void test(){ for ( int i = -3 ; i <= 3 ; i++){ int n = (Integer(i)).hashCode(); System.out.println( n & Integer.MAX_VALUE); }}/*2147483645214748364621474836470123*/
由此可见,hashCode值如果是负数的话,可以对其与Integer.MAX_VALUE按位运算,之后其结果变成**正数**
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值就是其对应的整型数值
感谢各位的阅读,以上就是“MapReduce默认分区Hash Partitioner怎么使用”的内容了,经过本文的学习后,相信大家对MapReduce默认分区Hash Partitioner怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。