[prev in list] [next in list] [prev in thread] [next in thread] 

List:       avro-dev
Subject:    [jira] [Commented] (AVRO-2149) Using GenericDatumWriter for writing GenericRecord with schema from t
From:       "Doug Cutting (JIRA)" <jira () apache ! org>
Date:       2018-02-22 16:33:00
Message-ID: JIRA.13140125.1519285290000.252695.1519317180161 () Atlassian ! JIRA
[Download RAW message or body]


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

Doug Cutting commented on AVRO-2149:
------------------------------------

By "generated type" you mean an enum class definition generated by Avro's specific \
compiler?  If so, then you should use SpecificDatumReader instead.  \
GenericDatumReader works for the generic data model.  SpecificDatumReader works for \
classes generated by the specific compiler (and generic data, because it inherits \
from GenericDatumReader).  ReflectDatumReader works for most POJO classes (plus \
specific & generic).

> Using GenericDatumWriter for writing GenericRecord with schema from the specified \
>                 generated type
> ------------------------------------------------------------------------------------------------
>  
> Key: AVRO-2149
> URL: https://issues.apache.org/jira/browse/AVRO-2149
> Project: Avro
> Issue Type: Improvement
> Components: java
> Affects Versions: 1.8.2
> Reporter: Wojciech Sroka
> Priority: Major
> 
> Currently using GenericDatumWriter for writing GenericRecord with schema from the \
> specified generated type cause exception when one of fields is enum type: \
> {code:java} Exception in thread "main" \
> org.apache.avro.file.DataFileWriter$AppendWriteException: \
> org.apache.avro.AvroTypeException: Not an enum: YELLOW at \
> org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:308) at \
> pl.ingbank.kafka.AvroErrorTester.runGenericWriterReaderTest(AvroErrorTester.java:65)
>  at pl.ingbank.kafka.AvroErrorTester.main(AvroErrorTester.java:27)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>  at java.lang.reflect.Method.invoke(Method.java:498)
> at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
> Caused by: org.apache.avro.AvroTypeException: Not an enum: YELLOW
> at org.apache.avro.generic.GenericDatumWriter.writeEnum(GenericDatumWriter.java:195)
>  at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:128)
>  at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:75)
> at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:177)
>  at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:167)
>  at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:118)
>  at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:75)
> at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:62)
> at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:302)
> ... 7 more{code}
> It is caused by method protected void writeEnum(Schema schema, Object datum, \
> Encoder out) in class org.apache.avro.generic.GenericDatumWriter: {code:java}
> protected void writeEnum(Schema schema, Object datum, Encoder out) throws \
> IOException { if (!data.isEnum(datum)) {
> throw new AvroTypeException("Not an enum: " + datum);
> }
> out.writeEnum(schema.getEnumOrdinal(datum.toString()));
> }{code}
> Fix for this is to add additional check does datum is enum type:
> {code:java}
> protected void writeEnum(Schema schema, Object datum, Encoder out) throws \
> IOException { if(datum.getClass().isEnum() && !data.isEnum(datum)){
> throw new AvroTypeException("Not an enum: " + datum);
> }
> out.writeEnum(schema.getEnumOrdinal(datum.toString()));
> }
> {code}
> This fix alows to serialize and deserialize generic record with schema from the \
> specified generated type.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic