You don't need to construct a record object. You can just write your
RecordA/RecorbB objects directly.
Sample Writer:
DatumWriter<Object> datum = new GenericDatumWriter<Object>(schema);
DataFileWriter<Object> writer = new DataFileWriter<Object>(datum);
FileOutputStream out = new FileOutputStream("h:\\TestFile.avro");
writer.create(schema, out);
writer.append(1050324); //You can write your recordA/recordB here.
writer.close();
Sample Reader:
File out = new File("h:\\TestFile.avro");
GenericDatumReader<Object> datum = new GenericDatumReader<Object>();
DataFileReader<Object> reader = new DataFileReader<Object>(out,
datum);
while (reader.hasNext()) {
System.out.println(reader.next());
}
reader.close();
Hope this helps.
Thanks,
Gaurav Nanda
On Thu, Dec 8, 2011 at 5:40 PM, Andrew Kenworthy <[email protected]> wrote:
> Hallo,
>
> is it possible to write/collect a union-ed record from an avro reducer?
>
> I have a reduce class (extending AvroReducer), and the output schema is a
> union schema of record type A and record type B. In the reduce logic I want
> to combine instances of A and B in the same datum, passing it to my
> Avrocollector. My code looks a bit like this:
>
> Record unionRecord = new GenericData.Record(myUnionSchema); // not legal!
> unionRecord.put("type A", recordA);
> unionRecord.put("type B", recordB);
> collector.collect(unionRecord);
>
> but GenericData.Record constructor expects a Record Schema. How can I write
> both records such that they appear in the same output datum?
>
> Andrew