2016-05-17 27 views
9

Tôi có đoạn mã sau và tôi không hiểu tại sao phương pháp get() đã được sử dụng trong dòng được đánh dấu. Nếu tôi xóa phương thức get(), nó sẽ báo lỗi cho tôi.Chuyển đổi IntWritatble thành int

Những gì tôi có thể lấy ra từ đó là: get() phương thức trả về giá trị int của IntWritable. Đúng nếu tôi đã sai lầm.

public void reduce(IntWritable key, Iterator<IntWritable> values, OutputCollector<IntWritable, IntWritable> output, Reporter reporter) throws IOException { 
    int sum = 0; 
    while (values.hasNext()) { 
     sum += values.next().get(); //error when removing the get()  
    } 
} 

Trả lời

5

Hiểu biết của bạn là chính xác. RamPrasad G's answer cũng chính xác (+1), nhưng, chỉ để làm cho nó rõ ràng hơn:

sum là int. values là một yếu tố Iterator đến IntWritable, vì vậy values.next()IntWritable. Bây giờ, IntWritable, một kiểu dữ liệu của hadoop, không tương đương với kiểu nguyên thủy int của java, ngay cả khi chúng được sử dụng cho cùng một điều: để lưu trữ các giá trị số nguyên.

Do đó, bạn không thể thêm IntWritable vào int (đó là những gì bạn làm nếu bạn xóa phương thức get()). Chúng không cùng loại. Bạn phải chuyển đổi IntWritable thành int, được thực hiện theo phương pháp get().

+0

Cảm ơn bạn rất nhiều cho việc xác minh nó !! – Sri

4

Để xử lý các đối tượng theo cách Hadoop, Hadoop sử dụng các lớp có thể ghi. Ví dụ: Hadoop sử dụng Văn bản thay vì Chuỗi của java. tương tự, lớp IntWritable trong Hadoop cũng tương tự như một java int, tuy nhiên, IntWritable thực hiện các giao diện như Comparable, WritableWritableComparable.

Các giao diện này đều cần thiết cho MapReduce; giao diện Comparable được sử dụng để so sánh khi bộ giảm tốc sắp xếp các khóa và Writable có thể ghi kết quả vào đĩa cục bộ. Nó không sử dụng java Serializable vì java Serializable quá lớn hoặc quá nặng đối với hadoop, Writable có thể tuần tự hóa đối tượng hadoop theo cách rất nhẹ.

giao diện Có thể ghi được được mô tả như

Một đối tượng serializable mà thực hiện một, hiệu quả, giao thức serialization đơn giản, dựa trên DataInputDataOutput

bạn values.next() là lớp IntWritable bạn phải sử dụng get() để có được kiểu nguyên thủy của nó.

+0

Cảm ơn bạn rất nhiều :) – Sri

2

Không giống như intInteger auto boxing/un-boxing, cùng không hoạt động cho intIntWritable.

Mã nguồn IntWritable cung cấp thêm chi tiết để bạn hiểu khái niệm tốt hơn.

/** A WritableComparable for ints. */ 
public class IntWritable implements WritableComparable { 
    private int value; 

    public IntWritable() {} 

    public IntWritable(int value) { set(value); } 

    /** Set the value of this IntWritable. */ 
    public void set(int value) { this.value = value; } 

    /** Return the value of this IntWritable. */ 
    public int get() { return value; } 

IntWritable được xây dựng từ int và cách duy nhất để lấy lại int là với việc sử dụng của get() API

+0

Cảm ơn bạn rất nhiều :) – Sri

+0

Bạn được chào đón. Nếu câu trả lời này hữu ích, bạn có thể upvote. –

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