如何在java中定义Avro联合

Gio*_*tta 5 java serialization avro

我已经定义了一个由记录组成的Avro模式,该记录包含两个(或更多)不同记录的并集,例如:

{
  "type":"record",
  "name":"MyCompositeRecord",
  "fields":
  [
    {"name":"SomeCommonData","type":"string"},
    {"name":"MoreCommonData","type":"float"},
    {"name":"CompositeRecord","type":
      [
        {
          "type":"record",
          "name":"FirstOption",
          "fields":
          [
            {"name":"x","type":"string"},
            {"name":"y","type":"long"}
          ]
        },
        {
          "type":"record",
          "name":"SecondOption",
          "fields":
          [
            {"name":"z","type":"int"},
            {"name":"w","type":"float"},
            {"name":"m","type":"double"},
            {"name":"l","type":"boolean"}
          ]
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

它看起来不太清楚,但我希望你能得到这个想法:我有一个由一些数据组成的记录("SomeCommonData"和"MoreCommonData")和两个不同类型记录的联合("FirstOption"和"SecondOption") .在序列化/反序列化时,我应该能够创建两个子记录中的任何一个并序列化"MyCompositeRecord".

我没有尝试为模式生成代码,因为我打算只使用通用记录.但是,我不确定这些通用记录是否以及如何序列化.我在网上找不到任何例子.我将使用java来序列化/反序列化.我能够为模式创建一个编写器/阅读器,如下所示:

Schema.Parser parser = new Schema.Parser();
Schema schema = parser.parse(COMPOSITE_SCHEMA);
DatumWriter<GenericRecord> writer = new GenericDatumWriter<>(schema);
DatumReader<GenericRecord> reader = new GenericDatumReader<>(schema);
GenericRecord datum = new GenericData.Record(schema);
Run Code Online (Sandbox Code Playgroud)

关于如何从这里开始实际构建记录的任何想法?

谢谢

Bru*_*tin 2

基本上对于联合来说,它与设置任何其他字段没有什么不同:

GenericRecord datum = new GenericData.Record(schema);

datum.set(1, data);
Run Code Online (Sandbox Code Playgroud)

其中 1 是联合字段编号,数据是正在设置的值。

如果您查看AvroEditor - Helper中的 getDefaultValue,您将看到我为每个 Avro 类型使用的默认值。数组必须实现GenericArray