Apache Giraph/Hadoop: перебор пользовательских ArrayWritable

Я думал, что это будет просто осуществить, но это начинает быть болью.

У меня есть подкласс ArrayWritable так:

public class VertexDistanceArrayWritable extends ArrayWritable {
    public VertexDistanceArrayWritable() {
        super(VertexDistanceWritable.class);
    }
    public VertexDistanceArrayWritable(VertexDistanceWritable[] v) {
        super(VertexDistanceWritable.class, v);
    }
}

И записываемый подкласс выглядит так:

public class VertexDistanceWritable implements Writable {

    //Implements write, readFields, and some custom functions that aren't used yet

}

В моей функции вычисления Giraph сообщения являются VertexDistanceArrayWritable's. Я хочу перебирать каждое VertexDistanceWritable каждое сообщение (VertexDistanceArrayWritable). Вот моя вычислительная функция:

@Override
public void compute(Vertex<Text, MapWritable, FloatWritable> vertex,
    Iterable<VertexDistanceArrayWritable> messages) throws IOException {

    for(VertexDistanceArrayWritable message : messages) {
        for(VertexDistanceWritable distEntry : message) {
            //Do stuff with distEntry
        }
    }

    //do other stuff

    vertex.voteToHalt();
}

Когда я компилирую код, я получаю эту ошибку:

for-each not applicable to expression type
    for(VertexDistanceWritable distEntry : message) {

  required: array or java.lang.Iterable
  found:    VertexDistanceArrayWritable

Так что теперь у меня есть проблема. Я хочу перебрать подкласс arrayWritable.

Я пробовал следующее:

  • Измените эту строку на for(VertexDistanceWritable distEntry : message.toArray()) который говорит мне, что for-each не применим к типу Object (обязательно: array или java.lang.Iterable, found: Object).

  • Измените эту строку на for(VertexDistanceWritable distEntry : message.get() ), который дает мне error: incompatible types - required: VertexDistanceWritable, found: Writable, Это самая странная проблема - VertexDistanceWritable расширяет Writable, разве это не должно работать нормально?

  • Написание собственной пользовательской функции get_foo() для VertexDistanceWritable, которая возвращает значения в виде VertexDistanceWritable[]. Конечно, значения являются частными и не имеют функции получения в соответствии с документацией, кроме get(), с которой у меня уже есть проблемы

Я просто хочу способ перебрать мой класс VertexDistanceArrayWritable. Это возможно даже в Hadoop? Должно быть, верно? Я должен быть в состоянии перебрать кучу элементов, которые я сделал в массиве, не так ли? Это похоже на чертовски простые вещи.

1 ответ

Примерно через 30 минут экспериментов и поиска в Google я нашел здесь ключ. Вроде сырный, но, похоже, правильно компилируется. По сути, просто используйте Writable, а затем приведите его к моей записи.

for(VertexDistanceArrayWritable message : messages) {
    for(Writable distWritable : message.get()) {
        vertexDistanceWritable distEntry = (VertexDistanceWritable) distWritable;
        //do other stuff
    }
}

Я еще не подтвердил, работает ли он правильно, я обновлю и подтвердлю свой ответ, когда смогу убедиться, что он работает.

редактировать: это работает. Может потребоваться конструктор копирования, так как у меня был один для VertexDistanceWritable, но я никогда не проверял это.

Другие вопросы по тегам