gpt4 book ai didi

hadoop - 这对 Text.hashCode() 和 Interger.MAX_VALUE 意味着什么?

转载 作者:可可西里 更新时间:2023-11-01 14:18:07 27 4
gpt4 key购买 nike

最近在看hadoop的权威指南。我有两个问题:

1.看到一段自定义Partitioner的代码:

public class KeyPartitioner extends Partitioner<TextPair, Text>{

@Override
public int getPartition(TextPair key, Text value, int numPartitions){
return (key.getFirst().hashCode()&Interger.MAX_VALUE)%numPartitions;
}
}

这对 &Integer.MAX_VALUE 意味着什么?为什么要使用 & 运算符?

2.我还想为 IntWritable 编写一个自定义分区程序。那么直接对 key.value%numPartitions 是否可以并且最好?

最佳答案

就像我在评论中写的那样,它用于保持结果整数为正。

让我们使用一个使用字符串的简单示例:

String h = "Hello I'm negative!";
int hashCode = h.hashCode();

hashCode为负值-1937832979

如果您用表示分区的正数 (>0) 修改,则结果数始终为负数。

System.out.println(hashCode % 5); // yields -4

由于分区永远不会为负数,因此您需要确保数字为正数。这是一个简单的位旋转技巧,因为 Integer.MAX_VALUE 有符号位(Java 中的 MSB,因为它是大端),它在负数上只有 1。

因此,如果您有一个设置了符号位的负数,您将始终AND它与 Integer.MAX_VALUE 的零,它始终为零.

不过你可以让它更具可读性:

return Math.abs(key.getFirst().hashCode() % numPartitions);

例如I have done that in Apache Hama's partitioner对于任意对象:

 @Override
public int getPartition(K key, V value, int numTasks) {
return Math.abs(key.hashCode() % numTasks);
}

关于hadoop - 这对 Text.hashCode() 和 Interger.MAX_VALUE 意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16621516/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com