我已经定义了一个 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"}
]
}
]
}
]
}
看起来不是很清楚,但我希望你明白:我有一个由一些数据(“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);
关于如何从这里开始实际建立记录的任何想法?
谢谢