我從Kafka主題接收二進制Avro文件,我必須反序列化它們。在Kafka收到的消息中,我可以在每條消息的開始處看到一個架構。我知道不嵌入模式並將其與實際的Avro文件分開是更好的做法,但我無法控制製作人,我無法更改。我如何從嵌入架構的Kafka反序列化Avro
我的代碼運行在Apache Storm上。首先,我創建一個讀者:
mDatumReader = new GenericDatumReader<GenericRecord>();
後來我嘗試反序列化消息沒有宣佈架構:
Decoder decoder = DecoderFactory.get().binaryDecoder(messageBytes, null);
GenericRecord payload = mDatumReader.read(null, decoder);
但是當一個消息到達我得到一個錯誤:
Caused by: java.lang.NullPointerException: writer cannot be null!
at org.apache.avro.io.ResolvingDecoder.resolve(ResolvingDecoder.java:77) ~[stormjar.jar:?]
at org.apache.avro.io.ResolvingDecoder.<init>(ResolvingDecoder.java:46) ~[stormjar.jar:?]
at org.apache.avro.io.DecoderFactory.resolvingDecoder(DecoderFactory.java:307) ~[stormjar.jar:?]
at org.apache.avro.generic.GenericDatumReader.getResolver(GenericDatumReader.java:122) ~[stormjar.jar:?]
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:137) ~[stormjar.jar:?]
我見過的所有答案都是關於使用其他格式,改變傳遞給Kafka或其他內容的消息。我無法控制這些事情。
我的問題是,給定bytes[]
與二進制消息內嵌入模式的消息,如何反序列化該Avro文件,而無需聲明模式,以便我可以讀取它。