Serialization 如何向avro模式中的可重复字段添加数据?

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

我试图在不生成代码的情况下测试avro serde和deserde(我使用代码生成完成了此任务)。模式如下

{
"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"
}