如何填充avro嵌套的地图结构

Mar*_*cin 1 avro

有没有人使用GenericData.Record过Avro和嵌套的地图记录.给出以下架构,我正在努力填充GenericData.Record地图:

 {"name": "log_data", "type":
   [ "null",
     { "type": "map", "values":
       { "type": "record",
         "name": "TypeValuePair",
         "fields": [
           {"name": "type", "type": "string"},
           {"name": "value", "type": ["null", "string"]}
         ]
       }
     }
   ]
 }
Run Code Online (Sandbox Code Playgroud)

java代码:

Schema mapSchema = schema.getField("log_data").schema().getTypes().get(1);

//The code below fails

GenericRecord typeValuePair =
    new GenericData.Record(mapSchema.getField("TypeValuePair").schema());
Run Code Online (Sandbox Code Playgroud)

有:

org.apache.avro.AvroRuntimeException: Not a record..
Run Code Online (Sandbox Code Playgroud)

知道我应该如何在avro架构中构建一个包含类型记录值的地图?

Mar*_*cin 5

我能够使用以下代码来实现此目的:

Schema mapSchema = schema.getField("log_data").schema().getTypes().get(1);

GenericRecord typeValuePair =  
              new GenericData.Record(mapSchema.getValueType());

ImmutableMap.Builder<String, GenericRecord> logDataBuilder = 
              ImmutableMap.<String, GenericRecord>builder();

typeValuePair.put("type","string");
typeValuePair.put("value", "field1 value");
logDataBuilder.put("field1", typeValuePair);

//Set the log_data map field in the schema
GenericRecordBuilder grb = new GenericRecordBuilder(schema);
grb.set("log_data", logDataBuilder.build());
grb.build();
Run Code Online (Sandbox Code Playgroud)