编程语言
首页 > 编程语言> > 在Java中创建Avro文件时如何编写并集

在Java中创建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对象(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);

标签:union,java,avro
来源: https://codeday.me/bug/20191122/2056455.html