You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Doug Cutting (JIRA)" <ji...@apache.org> on 2014/05/24 01:30:02 UTC
[jira] [Commented] (AVRO-1512) Error serializing TUnion with
avro-thrift
[ https://issues.apache.org/jira/browse/AVRO-1512?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14007871#comment-14007871 ]
Doug Cutting commented on AVRO-1512:
------------------------------------
Avro doesn't yet support Thrift unions. Simply removing that check doesn't cause unions to work correctly: a union is treated as an Avro record with optional fields, and it fails to read when it tries to set the non-selected branches of the Thrift union to null.
I can see a few options:
- Change getSchema() to fail for Thrift unions.
- Detect which Thrift unions can be implemented in Avro and implement those as Avro unions. The example you provide would translate to the Avro schema ["string", "string"], which is not legal and would result in an error, since Avro doesn't permit multiple union branches of the same type.
- Implement Thrift unions as Avro records with optional fields. In ThriftData#setField(), if the value is null and the object is a TUnion, ignore it.
> Error serializing TUnion with avro-thrift
> -----------------------------------------
>
> Key: AVRO-1512
> URL: https://issues.apache.org/jira/browse/AVRO-1512
> Project: Avro
> Issue Type: Bug
> Components: java
> Affects Versions: 1.7.6
> Reporter: Will Gorman
> Fix For: 1.7.7
>
> Attachments: AVRO-1512.patch, test.thrift
>
>
> Attempting to serialize a Thrift union type (TUnion) with avro-thrift produces an error like the following:
> {noformat}
> org.apache.avro.AvroRuntimeException: Unknown datum type org.apache.avro.thrift.test.FooOrBar: <FooOrBar foo:foo>
> at org.apache.avro.generic.GenericData.getSchemaName(GenericData.java:639)
> at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:604)
> at org.apache.avro.generic.GenericDatumWriter.resolveUnion(GenericDatumWriter.java:151)
> at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:71)
> at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:114)
> at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:104)
> at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:66)
> at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:58)
> at org.apache.avro.thrift.TestThrift.check(TestThrift.java:83)
> at org.apache.avro.thrift.TestThrift.testStruct(TestThrift.java:60)
> {noformat}
> Upon investigation it appears that ThriftData#isRecord intentionally does not accept TUnion types as Avro records and so GenericData is unable to determine an Avro type for the datum. However, ThriftData#getSchema does generate an Avro record schema for Thrift union types.
--
This message was sent by Atlassian JIRA
(v6.2#6252)