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, но я никогда не проверял это.