在Java中创建Avro文件时如何编写联合

时间:2014-03-04 14:37:25

标签: java union avro

我正在尝试用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,Gen​​ericData.Array等。对于那些没有准备好的对象,通常正确的对象只是一个标准的Java对象(实现“map”Avro类的java.util.Map)类型等。)。

但是我无法弄清楚用于编写联盟的实例化的正确对象是什么。

这个问题是指在没有代码生成的情况下编写Avro文件。非常感谢任何帮助。

1 个答案:

答案 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);