【发布时间】:2018-07-07 23:08:55
【问题描述】:
我在反序列化二进制数据时遇到了这个奇怪的错误: 以下是我对阅读器的实现:
Schema schema = new Schema.Parser().parse(new File("src/main/avro/queue_data.avsc"));
SpecificDatumReader<QueueData> reader = new SpecificDatumReader<QueueData>(schema);
Decoder decoder = DecoderFactory.get().binaryDecoder(body, null);
QueueData queueData = reader.read(null, decoder);
架构:https://pastebin.com/GUJgzeh4 样本数据:https://pastebin.com/CUf1U3iL
当我运行它时会抛出如下异常:
java.lang.ArrayIndexOutOfBoundsException: -40
at org.apache.avro.io.parsing.Symbol$Alternative.getSymbol(Symbol.java:424)
at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:290)
at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179)
at org.apache.avro.specific.SpecificDatumReader.readField(SpecificDatumReader.java:116)
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:222)
at org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:175)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:145)
at com.bpawan.messaging.Sender.readFromQueue(Sender.java:57)
at com.bpawan.messaging.Sender.access$000(Sender.java:15)
at com.bpawan.messaging.Sender$1.handleDelivery(Sender.java:38)
at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:149)
at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:104)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
很遗憾,错误消息并没有说明问题到底是什么。试了几次调试都没有成功。
数据的生产者是用php编写的。
【问题讨论】:
-
你有什么解决方案吗,我在从 Spark sql 函数 from_avro 读取 avro 消息时也遇到了类似的错误?