2015-05-12 4 views
0

Вот несколько кодов Avro, которые работают на одной машине, но с другой - с ошибкой.Avro пишет и читает работы на одной машине, а не на другом

Мы не можем убедиться, что здесь не так.

Вот код, вызывающий проблему.

Class<?> clazz = obj.getClass(); 
ReflectData rdata = ReflectData.AllowNull.get(); 
Schema schema = rdata.getSchema(clazz); 

ByteArrayOutputStream os = new ByteArrayOutputStream(); 
Encoder encoder = EncoderFactory.get().binaryEncoder(os, null); 
DatumWriter<T> writer = new ReflectDatumWriter<T>(schema, rdata); 
writer.write(obj, encoder); 
encoder.flush(); 
byte[] bytes = os.toByteArray(); 

String binaryString = new String (bytes, "ISO-8859-1"); 
BinaryDecoder decoder = DecoderFactory.get().binaryDecoder(binaryString.getBytes("ISO-8859-1"), null); 
GenericDatumReader<GenericRecord> datumReader = new GenericDatumReader<GenericRecord> (schema); 
GenericRecord record = datumReader.read(null, decoder); 

Исключение:

org.apache.avro.AvroRuntimeException: Malformed data. Length is negative: -32 
at org.apache.avro.io.BinaryDecoder.doReadBytes(BinaryDecoder.java:336) 
at org.apache.avro.io.BinaryDecoder.readString(BinaryDecoder.java:263) 
at org.apache.avro.io.ValidatingDecoder.readString(ValidatingDecoder.java:107) 
at org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:437) 
at org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:427) 
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:189) 
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:187) 
at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:263) 
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:216) 
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:183) 
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:173) 
+0

Пожалуйста, опубликуйте Исключение, включая трассировку стека –

+0

@KristofferE, я добавил исключение – user2250246

ответ

1

Добавление Dfile.encoding = UTF-8 в котом Params помогли нам решить эту проблему.

+0

Я был бы осторожен с этим явным использованием ISO-8859-1. Я считаю, что Avro записывает строки как байты UTF-8, а 8859-1 точно не соответствует UTF-8. Вы можете столкнуться с символами, которые нарушают ваш код, потому что вы интерпретируете байты как 8859-1 перед возвратом в байты, что может привести к повреждению данных. – Keegan

+0

ISO-8859-1 используется для двоичных кодировок чисел, которые не могут обрабатываться байтом UTF-8 для преобразования строк в следующий код: новый String (os.toByteArray(), «ISO-8859-1»); Вы видите проблемы с этим преобразованием? – user2250246

+0

Мне нужно будет еще кое-что выучить в Avro, чтобы проверить, в какой кодировке он его записывает. Это будет проблема, если это не 8859-1. Почему вы сначала конвертируете его в строку? – Keegan

Смежные вопросы