2013-05-18 67 views
5

Gần đây, tôi đang đọc hướng dẫn dứt khoát về hadoop. Tôi đã hai câu hỏi:Điều đó có nghĩa gì đối với Text.hashCode() & Interger.MAX_VALUE?

1.Tôi thấy một đoạn mã của phân vùng một tùy chỉnh:

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; 
    } 
} 

có nghĩa là gì cho & Integer.MAX_VALUE? tại sao nên sử dụng toán tử &?

2.Tôi cũng muốn viết Partitioner tùy chỉnh cho IntWritable. Vì vậy, nó là OK và tốt nhất cho key.value% numPartitions trực tiếp?

+1

'&' là một phép toán AND. – Maroun

+0

@MarounMaroun có, tôi biết, vì vậy họ sử dụng hashcode to Và max_value để giữ hashcode bên dưới giá trị max_value? – JoJo

+0

Để giữ cho nó tích cực, bởi vì phân vùng tiêu cực rõ ràng là vô nghĩa. –

Trả lời

11

Giống như tôi đã viết trong các nhận xét, nó được sử dụng để giữ nguyên số nguyên dương.

Hãy sử dụng một ví dụ đơn giản sử dụng Strings:

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

hashCode là tiêu cực với giá trị của -1937832979.

Nếu bạn muốn mod số này với số dương (> 0) biểu thị phân vùng, số kết quả luôn là số âm.

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

Vì phân vùng không bao giờ có giá trị âm, bạn cần đảm bảo số dương. Ở đây có một mẹo đơn giản bit twiddeling vào chơi, bởi vì Integer.MAX_VALUE có tất cả những người thực hiện bit dấu (MSB trong Java vì nó là lớn endian) mà chỉ là 1 trên số âm.

Vì vậy, nếu bạn có số âm với bộ bit dấu, bạn sẽ luôn luôn AND với số không là Integer.MAX_VALUE, giá trị này sẽ bằng không.

Bạn có thể làm cho nó dễ đọc hơn mặc dù:

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

Ví dụ I have done that in Apache Hama's partitioner cho các đối tượng tùy ý:

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

Giải thích thú vị! +1 từ phía tôi. –

Các vấn đề liên quan