使用GenericRecord在Avro中填充包含数组的嵌套记录

3

I have the following schema:

{
    "name": "AgentRecommendationList",
    "type": "record",
    "fields": [
        {
            "name": "userid",
            "type": "string"
        },
        {
            "name": "friends",
            "type": {
                "type": "array",
                "items": {
                    "name": "SchoolFriends",
                    "type": "record",
                    "fields": [
                        {
                            "name": "Name",
                            "type": "string"
                        },
                        {
                            "name": "phoneNumber",
                            "type": "string"
                        },
                        {
                            "name": "email",
                            "type": "string"
                        }
                    ]
                }
            }
        }
    ]
}

我正在使用GenericRecord,并希望将数组放入SchoolFriends中。
val avschema = new RestService(URL).getLatestVersion(name)
val schema = new Schema.Parser().parse(avschema.getSchema)
val record = new GenericData.Record(schema)

我想做类似于 `record.put(x)` 的操作。
1个回答

10

对于这个特定的模式,你可以按照以下方式进行操作。我建议将记录类型SchoolFriends放在不同的模式中,这样可以更轻松地获取集合元素的模式。

import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.GenericRecord;

import java.util.ArrayList;
import java.util.List;

public class PopulateNestedAvroObjects {
    public static void main(String [] args ){
        String strSchema = "{\n" +
                "    \"name\": \"AgentRecommendationList\",\n" +
                "    \"type\": \"record\",\n" +
                "    \"fields\": [\n" +
                "        {\n" +
                "            \"name\": \"userid\",\n" +
                "            \"type\": \"string\"\n" +
                "        },\n" +
                "        {\n" +
                "            \"name\": \"friends\",\n" +
                "            \"type\": {\n" +
                "                \"type\": \"array\",\n" +
                "                \"items\": {\n" +
                "                    \"name\": \"SchoolFriends\",\n" +
                "                    \"type\": \"record\",\n" +
                "                    \"fields\": [\n" +
                "                        {\n" +
                "                            \"name\": \"Name\",\n" +
                "                            \"type\": \"string\"\n" +
                "                        },\n" +
                "                        {\n" +
                "                            \"name\": \"phoneNumber\",\n" +
                "                            \"type\": \"string\"\n" +
                "                        },\n" +
                "                        {\n" +
                "                            \"name\": \"email\",\n" +
                "                            \"type\": \"string\"\n" +
                "                        }\n" +
                "                    ]\n" +
                "                }\n" +
                "            }\n" +
                "        }\n" +
                "    ]\n" +
                "}";

        Schema schema = new Schema.Parser().parse(strSchema);
        GenericRecord record = new GenericData.Record(schema);
        record.put("userid", "test user");
        Schema childSchema = record.getSchema().getField("friends").schema().getElementType();
        List<GenericRecord> friendList = new ArrayList();
        GenericRecord friend1 = new GenericData.Record(childSchema);
        friend1.put("Name", "1");
        friend1.put("phoneNumber", "2");
        friend1.put("email", "3");
        friendList.add(friend1);
        record.put("friends", friendList);
        System.out.println(record);


    }
}

这对我的C#代码也有帮助,我不得不用GenericRecord替换GenericData.Record,更大的改变是我无法让childNode.Schema适用于GenericRecord(转换为RecordSchema没有帮助),最终我使用child schema的字符串部分来仅创建子模式的模式。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接