Using  avro-1.6.2

I am encountering the following exception when I try to serialize a
constructed GenericRecord
using either the binary or json encoder . The schema compiles ok
(Schema.txt attachment to this email.)

Am I setting up one of the Java maps incorrectly?

java.lang.ClassCastException: java.lang.String cannot be cast to
org.apache.avro.generic.IndexedRecord
    at org.apache.avro.generic.GenericData.getField(GenericData.java:518)
    at org.apache.avro.generic.GenericData.getField(GenericData.java:533)
    at
org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:103)
    at
org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
    at
org.apache.avro.generic.GenericDatumWriter.writeMap(GenericDatumWriter.java:165)
    at
org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:68)
    at
org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:105)
    at
org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:65)
    at
org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:57)

I was looking at TestGenericRecordBuilder.java in the avro github testsuite
and it
also seems to be using the builder.set to build the record.


GenericRecord is constructed as follows : (schema is created by parsing the
json file
for the schema attached )

                GenericRecord root = new GenericData.Record(schema);
                GenericRecordBuilder grb = new GenericRecordBuilder(schema);
                GenericRecord postBody;
                JSONObject kvm = new JSONObject(kvmStr);
                ObjectMapper mapper = new ObjectMapper();
                LinkedHashMap<CharSequence, CharSequence> _kvm =
mapper.readValue(kvm.toString().getBytes(),LinkedHashMap.class);
                LinkedHashMap<CharSequence, CharSequence> arguments = new
LinkedHashMap<CharSequence, CharSequence>();
                arguments.put("update_interval", "1");
                arguments.put("attr", "pr");
                arguments.put("keys", "10,pr");
                arguments.put("f", "/var/f");
                arguments.put("pause", "0");

                LinkedHashMap<CharSequence, Object> ud = new
LinkedHashMap<CharSequence, Object>();
                ud.put("type", "MapStringUD");


                LinkedHashMap<CharSequence, Object> data = new
LinkedHashMap<CharSequence, Object>();
                LinkedHashMap<CharSequence, Object> pr = new
LinkedHashMap<CharSequence, Object>();
                ud.put("data", data);
                data.put("pr", pr);
                pr.put("type", "ListInt");
                Integer [] iData = {1,2,3,4,5,6,7,8,9,10};
                List<Integer> lData = Arrays.asList(iData);
                pr.put("data", lData );

                List<LinkedHashMap<CharSequence,CharSequence>> requests =
Arrays.asList(new LinkedHashMap<CharSequence,CharSequence>());

                grb.set("requests", requests);
                grb.set("upd", upd);
                grb.set("kvm", _kvm);
                grb.set("context", new LinkedHashMap<CharSequence,
CharSequence>());
                grb.set("properties", new LinkedHashMap<CharSequence,
CharSequence>());
                grb.set("arguments", arguments);

                postBody = grb.build();
                JSONObject jj = new JSONObject(postBody.toString());
                System.out.println("json from avro is : ");
                System.out.println(jj.toString());
                json = jj;
                byte [] b = encodeJson(postBody);

GenericRecord.toString() shows the following :

{"requests":[{}],"arguments":{"pause":"0","keys":"10,pr","update_interval":"1","attr":"pr","f":"/var/f"},"context":{},"properties":{},"ud":{"data":{"pr":{"data":[1,2,3,4,5,6,7,8,9,10],"type":"ListInt"}},"type":"MapStringUD"},"kvm":{"K1":"VMFkNrrKcbRn","K2":"md&b=2","K3":"p=rsn1"}}

Schema is in attached file.

Thanks
Sameer
{
    "name": "rec1",
    "type": "record",
    "fields": [
        {
            "name": "requests",
            "default": [],
            "type": {
                "type": "array",
                "items": {"type": "map", "values": "string"}
            }
        },
        {
            "name": "arguments",
            "default": {
                "arguments": "{}"
            },
            "type": {
                "type": "map",
                "values": "string"
            }
        },
        {
            "name": "context",
            "default": {
                "context": "{}"
            },
            "type": {
                "type": "map",
                "values": "string"
            }
        },
        {
            "name": "kvm",
            "default": {
                "kvm": "{}"
            },
            "type": {
                "type": "map",
                "values": "string"
            }
        },
        {
            "name": "properties",
            "default": {
                "properties": "{}"
            },
            "type": {
                "type": "map",
                "values": "string"
            }
        },
        {
            "name": "ud",
            "default": {
                "data": {
                    "pr": {
                        "data": [
                            1,
                            2
                        ],
                        "type": "ListInt"
                    }
                }
            },
            "type": {
                "type": "map",
                "values": {
                    "name": "udvalues",
                    "type": "record",
                    "fields": [
                        {
                            "name": "data",
                            "default" : { "pr": { "data": [ 1, 2 ], "type": 
"ListInt" } },
                            "type": {
                                "type": "map",
                                "values": {
                                    "name": "datavalues",
                                    "type": "record",
                                    "fields": [
                                        {
                                            "name": "pr",
                                            "default" : { "data": [ 1, 2 ], 
"type": "ListInt" },
                                            "type": {
                                                "type": "map",
                                                "values": {
                                                    "name": "pr",
                                                    "type": "record",
                                                    "fields": [
                                                        {
                                                            "name": "data",
                                                             "default" : [1, 2],
                                                            "type": {
                                                                "type": "array",
                                                                "items": "int"
                                                            }
                                                        },
                                                        {
                                                            "name": "type",
                                                             "default" : 
"ListInt",
                                                            "type": "string"
                                                        }
                                                    ]
                                                }
                                            }
                                        }
                                    ]
                                }
                            }
                        },
                        {
                            "name": "type",
                            "default": "MapStringUD",
                            "type": "string"
                        }
                    ]
                }
            }
        }
    ]
}

Reply via email to