
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 = 129int b = 128System.out.println(a&b); // 128}}/*解析:"a"是129,转换成二进制是:10000001"b"是128,转换成二进制是:10000000按照&与的特性:1与1为11与0为0so,结果: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值就是其对应的整型数值
文章转载自删库跑路小分队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




