MapReduce默认分区HashPartitioner怎么使用

这篇文章主要讲解了“MapReduce默认分区Hash Partitioner怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MapReduce默认分区Hash Partitioner怎么使用”吧!

黄石港ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

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怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


文章名称:MapReduce默认分区HashPartitioner怎么使用
网址分享:http://myzitong.com/article/iehcpj.html