在Java中,我遇到了以下一行:
e.g.: (1 & Integer.MAX_VALUE) % 4
e.g.: (2 & Integer.MAX_VALUE) % 5是干什么的呢?我尝试过该代码,但我无法理解它的目的或功能。要检查的代码是什么?
基本上,它是(int & Integer.MAX_VALUE) % int。
实际代码(来自Hadoop培训班):
public int getPartition(StringPairWritable key, Text value, int numReduceTasks) {
return (key.getLeft().hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}发布于 2015-09-03 05:56:07
i & Integer.MAX_VALUE执行与以下代码相同的操作:
if(i < 0) {
i = (i + Integer.MAX_VALUE + 1);
}%是一个常规的余数操作。
如果您不关心整数的实际值,这是确保整数为正的快速方法(例如,如果您想将既可以是正数又可以是负数的随机数转化为正数)。
发布于 2015-09-03 05:49:26
Integer.MAX_VALUE是0x7FFFFFFF。因此,num & Integer.MAX_VALUE清除了num中的最高位。% numReduceTasks是经numReduceTasks除法后的正常余数。
这样做是为了将有符号数字转换为非负数,然后从0到numReduceTasks-1得到均匀分布的值。请注意,如果您编写Math.abs(key.getLeft().hashCode()) % numReduceTasks,如果hashCode()碰巧是Integer.MIN_VALUE,则可能会得到负数,因为Math.abs(Integer.MIN_VALUE)仍然是Integer.MIN_VALUE。因此,& Integer.MAX_VALUE是一种更安全的选择。
发布于 2015-09-03 06:28:00
这里有两部分:
让我们先介绍一下Java方面的内容。这是非常简单的按位计算,因为它清除符号位并将值转换为正整数。
这很容易在这里演示;让我们假设我们的密钥是-128876912,即0xF8517E90。int的最大值是0x7FFFFFFF。
如果我们查看实际的数学操作,符号位将被清除(在本例中还有相当多的其他位),并得到一个正整数值。
1111 1000 0101 0001 0111 1110 1001 0000
0111 1111 1111 1111 1111 1111 1111 1111
---------------------------------------
0111 1000 0101 0001 0111 1110 1001 0000如果值为正,则净结果是我们得到相同的值。
这一点很重要,因为哈希代码可能会返回负值;我不认为您想要负值是因为稍后很重要的原因。
对于分区位,这是一个比我真正声称的更多的Hadoop知识,但是在读文档‘之后,从而指定了处理特定数据位的哪一个缩减器。
根据我对它的阅读,这是默认提供的分词之一,可能并不完全适合您的使用(例如,您可能希望使用以不同的方式将数据分组 )。
https://stackoverflow.com/questions/32367741
复制相似问题