温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MapReduce默认分区Hash Partitioner怎么使用

发布时间:2021-12-09 16:14:30 来源:亿速云 阅读:161 作者:iii 栏目:大数据

这篇文章主要讲解了“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为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值就是其对应的整型数值 

感谢各位的阅读,以上就是“MapReduce默认分区Hash Partitioner怎么使用”的内容了,经过本文的学习后,相信大家对MapReduce默认分区Hash Partitioner怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI