我正在尝试用Java创建Avro文件(目前仅测试代码).一切正常,代码看起来像这样:
GenericRecord record = new GenericData.Record(schema);
File file = new File("test.avro");
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema);
DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(datumWriter);
dataFileWriter.create(schema, file);
dataFileWriter.append(record);
dataFileWriter.close();
我现在面临的问题是-当我想编写Union时我要实例化哪种Java对象?不一定在顶层,可以将联合附加到正在写入的记录上.有一些针对复杂类型准备的对象,例如GenericData.Record,GenericData.Array等.对于那些没有准备好的对象,通常正确的对象只是一个标准的Java对象(java.util.Map实现“地图” Avro类的类类型等).
但是我无法弄清楚要实例化编写Union的正确对象.
这个问题是指编写没有代码生成的Avro文件.很感谢任何形式的帮助.
解决方法:
这是我所做的:
假设模式定义如下:
record MyStructure {
...
record MySubtype {
int p1;
}
union {null, MySubtype} myField = null;
...
}
这是Java代码:
Schema schema; // the schema of the main structure
// ....
GenericRecord rec = new GenericData.Record(schema);
int i = schema.getField("myField").schema().getIndexNamed("MySubtype");
GenericRecord myField = new GenericData.Record(schema.getField("myField").schema().getTypes().get(i));
myField.put("p1", 100);
rec.put("myField", myField);