Реализация ArrayWritable для пользовательского типа Hadoop - PullRequest
4 голосов
/ 08 декабря 2010

Как определить ArrayWritable для пользовательского типа Hadoop?Я пытаюсь реализовать инвертированный индекс в Hadoop, с помощью пользовательских типов Hadoop для хранения данных

У меня есть класс Individual Posting , в котором хранится термин частота, идентификатор документа и список смещений байтов.для термина в документе.

У меня есть класс Проводка с периодичностью документа (количество документов, в котором появляется термин) и список отдельных проводок

Iопределили LongArrayWritable, расширяющий класс ArrayWritable для списка смещений байтов в IndividualPostings

Когда я определил пользовательский ArrayWritable для IndividualPosting Я столкнулся с некоторыми проблемами после локального развертывания (используя Karmasphere, Eclipse).

Все экземпляры IndividualPosting в списке в классе Posting будут одинаковыми, даже если я получу разные значения в методе Reduce

1 Ответ

9 голосов
/ 08 декабря 2010

Из документации ArrayWritable:

Доступно для записи для массивов, содержащих экземпляры класса. Элементы этой записи должны быть экземплярами одного и того же класса. Если этот доступный для записи будет входом для Reducer, вам нужно будет создать подкласс, который устанавливает значение соответствующего типа. Например: public class IntArrayWritable extends ArrayWritable { public IntArrayWritable() { super(IntWritable.class); } }

Вы уже упоминали, что делаете это с типом WritableComparable, определенным Hadoop. Вот что я предполагаю, что ваша реализация выглядит для LongWritable:

public static class LongArrayWritable extends ArrayWritable
{
    public LongArrayWritable() {
        super(LongWritable.class);
    }
    public LongArrayWritable(LongWritable[] values) {
        super(LongWritable.class, values);
    }
}

Вы можете сделать это с любым типом, который реализует WritableComparable, как указано в документации . Используя их пример:

public class MyWritableComparable implements
        WritableComparable<MyWritableComparable> {

    // Some data
    private int counter;
    private long timestamp;

    public void write(DataOutput out) throws IOException {
        out.writeInt(counter);
        out.writeLong(timestamp);
    }

    public void readFields(DataInput in) throws IOException {
        counter = in.readInt();
        timestamp = in.readLong();
    }

    public int compareTo(MyWritableComparable other) {
        int thisValue = this.counter;
        int thatValue = other.counter;
        return (thisValue < thatValue ? -1 : (thisValue == thatValue ? 0 : 1));
    }
}

И это должно быть так. Предполагается, что вы используете ревизию 0.20.2 или 0.21.0 API Hadoop.

...