[
https://issues.apache.org/jira/browse/AVRO-680?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14318976#comment-14318976
]
Ryan Blue commented on AVRO-680:
--------------------------------
bq. For user-defined classes like `Map<Foo, Bar>`, we cannot generate
`FooBarPair` because the Foo/Bar names may be present in multiple packages.
True, but this is only a problem if you have a conflict that is used in the
same position in the resulting Avro schema. So you need both {{one.Foo}} and
{{two.Foo}} classes, present in the same Avro schema, both used as keys (or
both used as values), and paired with the same type. That seems unlikely enough
that I'm comfortable with it. Otherwise, we could restrict it to just primitive
types.
bq. Can you give me the code which did not give array schema for a non-string
map?
{code:java}
Map<Integer, String> m = new HashMap<Integer, String>();
m.put(34, "s");
ReflectData.get().getSchema(m);
{code}
bq. we changed [normal array write logic] to the current implementation based
on some discussion that happened above
I think you're referring to this comment:
bq. Apparently, it isn't exactly possible to call
ReflectDatumWriter#writeNonStringMap() from inside
ReflectDatumWriter#writeArray(). This is so because if that happens, then it
means the array-part of non-string-map is already processed and we are at the
individual record level. And at this level, we cannot distinguish the map-entry
from a normal array-element. Due to this, mapEntry.getKey() and
mapEntry.getValue() could not be called, leading us back to relying on the
names "key" and "value".
Does this still apply? In {{ReflectDatumWriter#writeNonStringMap}}, you call
{{writeField(mapEntry, keyField, outEnc, state)}} that doesn't call
{{mapEntry.getKey()}}. It looks like you use the accessor and rely on the
field's name being "key" anyway. It would also make sense to have the accessor
fall back to {{Map.Entry#getKey()}} if the underlying field isn't available. I
think you might be able to change back to the regular array logic now.
> Allow for non-string keys
> -------------------------
>
> Key: AVRO-680
> URL: https://issues.apache.org/jira/browse/AVRO-680
> Project: Avro
> Issue Type: Improvement
> Affects Versions: 1.7.6, 1.7.7
> Reporter: Jeremy Hanna
> Attachments: AVRO-680.patch, AVRO-680.patch, PERF_8000_cycles.zip,
> isMap_Call_Hierarchy.png, non_string_map_keys.zip, non_string_map_keys2.zip,
> non_string_map_keys3.zip, non_string_map_keys4.patch,
> non_string_map_keys5.patch, non_string_map_keys6.patch,
> non_string_map_keys7.patch, non_string_map_perf.txt,
> non_string_map_perf2.txt, original_perf.txt
>
>
> Based on an email thread back in April, Doug Cutting proposed a possible
> solution for having non-string keys:
> Stu Hood wrote:
> > I can understand the reasoning behind AVRO-9, but now I need to look for an
> > alternative to a 'map' that will allow me to store an association of bytes
> > keys to values.
> A map of Foo has the same binary format as an array of records, each
> with a string field and a Foo field. So an application can use an array
> schema similar to this to represent map-like structures with, e.g.,
> non-string keys.
> Perhaps we could establish standard properties that indicate that a
> given array of records should be represented in a map-like way if
> possible? E.g.,:
> {"type": "array", "isMap": true, "items": {"type":"record", ...}}
> Doug
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)