Сериализация в Hadoop - доступная для записи
Это класс, который реализует Writable..
public class Test implements Writable {
List<AtomicWritable> atoms = new ArrayList<AtomicWritable>();
public void write(DataOutput out) throws IOException {
IntWritable size = new IntWritable(atoms.size());
size.write(out);
for (AtomicWritable atom : atoms)
atom.write(out);
}
public void readFields(DataInput in) throws IOException {
atoms.clear();
IntWritable size = new IntWritable();
size.readFields(in);
int n = size.get();
while(n-- > 0) {
AtomicWritable atom = new AtomicWritable();
atom.readFields(in);
atoms.add(atom);
}
}
}
Я буду очень признателен, если вы поможете мне понять, как вызывать метод write и readFields. По сути, я не понимаю, как построить тестовый объект в этом случае. Как только объект записан в DataOutput obj, как нам восстановить его в объекте DataInput. Это может звучать глупо, но я новичок в Hadoop, и ему был назначен проект, который использует Hadoop. Пожалуйста помоги.
Спасибо!!!
1 ответ
В основном я не понимаю, как построить
Test
объект в этом случае.
Да, вы упускаете суть. Если вам нужно построить экземпляр Test
и заселить atoms
тогда вам нужно добавить конструктор Test
:
public Test(ArrayList<AtomicWritable> atoms) {
this.atoms = atoms;
}
или вам нужно использовать конструктор по умолчанию и добавить метод или установщик, который позволяет вам добавлять элементы в atoms
или установите значение atoms
, Последнее на самом деле довольно распространено в среде Hadoop, чтобы иметь конструктор по умолчанию и set
метод. ср., например, Text.set
,
Ты не звонишь readFields
а также write
; платформа Hadoop делает это для вас, когда нужно сериализовать и десериализовать входы и выходы в и из map
а также reduce
,