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. Я хочу перебирать каждое 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 not applicaable to type Object (обязательно: array или java.ленг.Iterable, found: Object).

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

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

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

1 ответ

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

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

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

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