The map union value you currently have can certainly carry another map type
within. Here's how you'd probably want to define it:

{
    "name": "metadata",
    "type": {
        "type": "map",
        "values": [
            "null",
            "int",
            "float",
            "string",
            "boolean",
            "long",
            {
                "type": "map",
                "values": [
                    "null",
                    "int",
                    "float",
                    "string",
                    "boolean",
                    "long"
                ]
            }
        ]
    }
}

P.s. Its generally better to specify "null" as the first union type:
http://avro.apache.org/docs/current/spec.html#Unions

On Mon, 27 Mar 2017 at 16:47 Dag Stockstad <[email protected]> wrote:

> Hi Avro aficionados,
>
> I'm having trouble serializing a record with a nested map structure i.e. a
> map within a map. The record I'm trying to send has the following structure:
> {
>     "event_type": "some_type",
>     "data": {
>         "id": "2f720f90-ea06-4248-a72e-01eea44981ed",
>         "metadata": {
>             "some_attr": "some_value",
>             "some_map_with_unpredictable_name": {
>                 "some_attr": "some_value"
>             }
>         }
>     }
> }
>
> And the schema is this:
> {
>     "namespace": "org.example.event.avro",
>     "type": "record",
>     "name": "EventNotification",
>     "fields": [{
>         "name": "event_type",
>         "type": "string"
>     }, {
>         "name": "data",
>         "type": {
>             "type": "record",
>             "name": "EventData",
>             "fields": [{
>                 "name": "id",
>                 "type": "string"
>             }, {
>                 "name": "metadata",
>                 "type": {
>                     "type": "map",
>                     "values": [
>                         "int",
>                         "float",
>                         "string",
>                         "boolean",
>                         "long",
>                         "null"
>                     ]
>                 }
>             }]
>         }
>     }]
> }
>
> The nested map (some_map_with_unpredictable_name) is causing problems
> (serialization error). Is there any way I can have another map as a value
> in the metadata map?
>
> Due to the nature of the system, I cannot 100% predict the structure of
> the metadata field. Can Avro accomodate these requirements or do I have to
> fall back on something such as JSON for this one?
>
> Help very appreciated (I'm a bit stuck).
>
> Kind regards,
> Dag
>
>

Reply via email to