暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MapReduce默认分区HashPartitioner

删库跑路小分队 2021-09-03
634


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
        -1
        0
        1
        2
        3
        */


        由此可见,对于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);
          }
          }
          /*
          2147483645
          2147483646
          2147483647
          0
          1
          2
          3
          */

          由此可见,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->97
            b->98
            ...
            x->120
            y->121
            z->122
            */


            由此可见,英文a->z或A->Z的hashCode值就是其对应的整型数值 



            文章转载自删库跑路小分队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论