Я видел странное поведение при использовании Avro в MapReduce Job. Действительно, Iterable используется очень странно: iterator.next не указывает на объект, а на то, что меняет его значение при каждом вызове функции «next» !!Странное поведение Iterable в AVRO (внутри MapReduce)
Пример:
public static class MyAvroReducer extends AvroReducer<Long, MyAvroType,
Pair<Long, MyAvroType>> {
@Override
public void reduce(Long user, Iterable<MyAvroType> listAvroType,
AvroCollector<Pair<Long,MyAvroType>> collector,
Reporter reporter)
throws IOException {
// basically here I am expecting a list of two MyAvroType object
// The first one who has a field "type" equals to "foo" and the second
// who has a filed "type" equals to "bar"
MyAvroType foo;
MyAvroType bar;
for (MyAvroType obj : listAvroType){
if (obj.getType().equals("foo") {foo = obj;}
else if (obj.getType().equals("bar") {bar = obj;}
}
system.out.println("FOO: " + foo.getType());
system.out.println("FOO: " + bar.getType());
}
Стандартный вывод говорит:
FOO: бар
BAR: бар
Как было закодировал Iterable здесь? и почему ?? Или, может, я что-то не так?
Спасибо за ваш ответ, я использовал клонирование тоже решить problème. Кстати, я могу понять оптимизацию, но это не то, что разработчик ожидает от поведения итератора ... – stefff