我正在尝试用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对象(实现“map”Avro类的java.util.Map)类型等。)。
但是我无法弄清楚用于编写联盟的实例化的正确对象是什么。
这个问题是指在没有代码生成的情况下编写Avro文件。非常感谢任何帮助。
答案 0 :(得分:3)
这就是我的所作所为:
假设架构定义如下:
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);