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/01/15 19:29:27 UTC

[jira] [Commented] (AVRO-1440) the problem of resolving schema

    [ https://issues.apache.org/jira/browse/AVRO-1440?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13872382#comment-13872382 ] 

Doug Cutting commented on AVRO-1440:
------------------------------------

Avro requires that the reader have the writer's schema as well.  In data files the writer's schema is stored in the header.  In RPC this is arranged through the handshake.  I see no evidence in your examples that the writer's schema is provided.  You are attempting to read data providing only the reader's schema.

To make this work you will need to use something like the following to create your DatumReader:

{code}
new GenericDatumReader<Object>(userLessSchema, userMoreSchema);
{code}

Moreover, if these two schemas have different names, you'll need to provide the old name as an alias, e.g.:

{code}
... "name":"UserMore", "aliases":["UserLess"] ...
{code}

Lastly, when you add a new field that's not present in data you read you must specify a default value:

{code}
{"name":"favoritecolor", "type":"string", "default":"blue"}
{code}


> the  problem  of resolving schema 
> ----------------------------------
>
>                 Key: AVRO-1440
>                 URL: https://issues.apache.org/jira/browse/AVRO-1440
>             Project: Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.7.5
>         Environment: jdk1.7.0_45
>            Reporter: nivance
>              Labels: patch
>
> In Apache Avro™ 1.7.5 Documentation, have a sentence like this:
> {quote}Since both client and server both have the other's full schema, correspondence between same named fields, missing fields, extra fields, etc. can all be easily resolved.{quote}
> *But if client has two fields and server has three fields, the server can't resolve.*
> *Client avsc:*
> {"type":"record",
> "name":"UserLess",
> "namespace":"com.joyveb.test.bean",
> "fields":[{"name":"name","type":"string"},{"name":"favoritenumber","type":"int"}]}
> *serialize codes:*
> ByteArrayOutputStream bao = new ByteArrayOutputStream();
> GenericDatumWriter<Object> w = new GenericDatumWriter<Object>(userLess.getSchema());
> Encoder e = EncoderFactory.get().binaryEncoder(bao, null);
> w.write(object, e);
> e.flush();
> ByteBuffer.wrap(bao.toByteArray());
> *Server avsc:*
> {"type":"record",
> "name":"UserMore",
> "namespace":"com.joyveb.test.bean",
> "fields":[{"name":"name","type":"string"},{"name":"favoritenumber","type":"int"},{"name":"favoritecolor","type":"string"}]}
> *deserialize codes:*
> BinaryDecoder in = DecoderFactory.get().binaryDecoder(bytes, null);
> Object result = new GenericDatumReader<Object>(userMore.getSchema()).read(null, in);
> *After run the program, following exception comes out.*
> Exception in thread "main" java.io.EOFException
> 	at org.apache.avro.io.BinaryDecoder.ensureBounds(BinaryDecoder.java:473)
> 	at org.apache.avro.io.BinaryDecoder.readInt(BinaryDecoder.java:128)
> 	at org.apache.avro.io.BinaryDecoder.readString(BinaryDecoder.java:259)
> 	at org.apache.avro.io.ValidatingDecoder.readString(ValidatingDecoder.java:107)
> 	at org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:363)
> 	at org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:355)
> 	at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:157)
> 	at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)
> 	at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)
> 	at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)
> 	at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142)
> 	at com.joyveb.dbpapi.AvroByteUtil.deserialize(AvroByteUtil.java:81)
> 	at com.joyveb.dbpapi.test.avro.SchemaByteTest.less2more(SchemaByteTest.java:34)
> 	at com.joyveb.dbpapi.test.avro.SchemaByteTest.main(SchemaByteTest.java:15)



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)