2016-05-17 19 views
9

Mam następujący kod i nie rozumiem, dlaczego użyto metody get() w podświetlonej linii. Jeśli usuniemy tę metodę get(), wyśle ​​mi błąd.Konwertowanie IntWritatble na int

To, co mogę z niego wyciągnąć to: get() Metoda zwraca wartość int IntWritable. Popraw mnie, jeśli się mylę.

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()  
    } 
} 

Odpowiedz

5

Twoje zrozumienie jest prawidłowe. RamPrasad G's answer jest również poprawny (+1), ale tylko po to, aby było jaśniejsze:

sum to int. values to elementy Iterator do IntWritable, więc values.next() to IntWritable. Teraz IntWritable, typ danych hadoop, nie jest równoważny pierwotnemu typowi int java, nawet jeśli są one używane do tej samej rzeczy: do przechowywania wartości całkowitych.

W ten sposób nie można dodać IntWritable do int (co można zrobić po usunięciu metody get()). Nie są tego samego typu. Musisz przekonwertować IntWritable na int, który jest wykonywany metodą get().

+0

Dziękuję bardzo za sprawdzenie go !! – Sri

4

Aby poradzić sobie z obiektami w Hadoop, Hadoop używa klas Writable. Na przykład, Hadoop używa tekstu zamiast łańcucha java. podobnie, klasa IntWritable w Hadoop jest podobna do java int, jednak IntWritable implementuje interfejsy takie jak Comparable, Writable i WritableComparable.

Te interfejsy są niezbędne dla MapReduce; Interfejs Comparable służy do porównywania, gdy reduktor sortuje klucze, a Writable może zapisać wynik na dysku lokalnym. Nie używa ona java Serializable, ponieważ java Serializable jest zbyt duża lub zbyt ciężka, aby hadoop, Writable mógł dokonać serializacji obiektu hadoop w bardzo lekki sposób.

Writable interfejs jest opisany jako

postaci szeregowej obiekt, który implementuje prosty, skuteczny, protokół serializacji, na podstawie DataInput i DataOutput

swojej values.next() jest IntWritable klasa trzeba użyć get() metoda uzyskiwania jej pierwotnego typu.

+0

Dziękuję bardzo :) – Sri

2

przeciwieństwie int i Integer auto boks/un-boxingu, tak samo nie działa int i IntWritable.

Kod źródłowy IntWritable dostarcza więcej informacji, aby lepiej zrozumieć tę koncepcję.

/** 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 jest wykonana z int, a jedynym sposobem, aby wrócić int jest z wykorzystaniem get() API

+0

Dziękuję bardzo :) – Sri

+0

Nie ma za co. Jeśli ta odpowiedź jest przydatna, możesz awansować. –