Serialization 如何向avro模式中的可重复字段添加数据?
我试图在不生成代码的情况下测试avro serde和deserde(我使用代码生成完成了此任务)。模式如下Serialization 如何向avro模式中的可重复字段添加数据?,serialization,schema,deserialization,file-format,avro,Serialization,Schema,Deserialization,File Format,Avro,我试图在不生成代码的情况下测试avro serde和deserde(我使用代码生成完成了此任务)。模式如下 { "type": "record", "name" : "person", "namespace" : "avro", "fields": [ { "name" : "personname", "type": ["null","string"] }, { "name" : "personId", "type": ["null","string"] }, { "n
{
"type": "record",
"name" : "person",
"namespace" : "avro",
"fields": [
{ "name" : "personname", "type": ["null","string"] },
{ "name" : "personId", "type": ["null","string"] },
{ "name" : "Addresses", "type": {
"type": "array",
"items": [ {
"type" : "record",
"name" : "Address",
"fields" : [
{ "name" : "addressLine1", "type": ["null", "string"] },
{ "name" : "addressLine2", "type": ["null", "string"] },
{ "name" : "city", "type": ["null", "string"] },
{ "name" : "state", "type": ["null", "string"] },
{ "name" : "zipcode", "type": ["null", "string"] }
]
}]
}
},
{ "name" : "contact", "type" : ["null", "string"]}
]
}
我理解这是如何将数据添加到模式中的
Schema schema = new Schema.Parser().parse(new File("src/person.avsc.txt"));
GenericRecord person1 = new GenericData.Record(schema);
person1.put("personname", "goud");
但我如何将城市、州等添加到地址,然后再将其添加到地址
GenericRecord address1 = new GenericData.Record(schema);
address1.put("city", "SanJose");
上面的代码片段不起作用。我试着调查一下一般情况,但我没能理解 您需要在单独的模式中描述内部复杂类型(“类型”:“记录”、“名称”:“地址”),如下所示:
{
"type" : "record",
"name" : "Address",
"fields" : [
{ "name" : "addressLine1", "type": ["null", "string"] },
{ "name" : "addressLine2", "type": ["null", "string"] },
{ "name" : "city", "type": ["null", "string"] },
{ "name" : "state", "type": ["null", "string"] },
{ "name" : "zipcode", "type": ["null", "string"] }
]
}
然后可以创建一个内部对象:
Schema innerSchema = new Schema.Parser().parse(new File("person_address.avsc"));
GenericRecord address = new GenericData.Record(innerSchema);
address.put("addressLine1", "adr_1");
address.put("addressLine2", "adr_2");
address.put("city", "test_city");
address.put("state", "test_state");
address.put("zipcode", "zipcode_00000");
然后将创建的内部对象添加到ArrayList
最后,创建主对象并在其中添加所有人员
以下是java的完整示例:
Schema innerSchema = new Schema.Parser().parse(new File("person_address.avsc"));
GenericRecord address = new GenericData.Record(innerSchema);
address.put("addressLine1", "adr_1");
address.put("addressLine2", "adr_2");
address.put("city", "test_city");
address.put("state", "test_state");
address.put("zipcode", "zipcode_00000");
ArrayList<GenericRecord> addresses = new ArrayList<>();
addresses.add(address);
Schema mainSchema = new Schema.Parser().parse(new File("person.avsc"));
GenericRecord person1 = new GenericData.Record(mainSchema);
person1.put("personname", "goud");
person1.put("personId", "123_id");
person1.put("Addresses", addresses);
{
"personname": "goud",
"personId": "123_id",
"Addresses": [
{
"addressLine1": "adr_1",
"addressLine2": "adr_2",
"city": "test_city",
"state": "test_state",
"zipcode": "zipcode_00000"
}
],
"contact": "test_contact"
}