Кодировать объект с Avro в массив байтов в Python

В python 2.7, используя Avro, я хотел бы кодировать объект в массив байтов.

Все примеры, которые я нашел, записывают в файл.

Я пробовал использовать io.BytesIO(), но это дает:

AttributeError: '_io.BytesIO' object has no attribute 'write_long'

Пример с использованием io.BytesIO

def avro_encode(raw, schema):
    writer = DatumWriter(schema)
    avro_buffer = io.BytesIO()
    writer.write(raw, avro_buffer)
    return avro_buffer.getvalue()

Ответ 1

Ваш вопрос помог мне разобраться в этом, поэтому спасибо. Вот простой пример python, основанный на примере python в документах:

import io
import avro.schema
import avro.io

test_schema = '''
{
"namespace": "example.avro",
 "type": "record",
 "name": "User",
 "fields": [
     {"name": "name", "type": "string"},
     {"name": "favorite_number",  "type": ["int", "null"]},
     {"name": "favorite_color", "type": ["string", "null"]}
 ]
}
'''

schema = avro.schema.parse(test_schema)
writer = avro.io.DatumWriter(schema)

bytes_writer = io.BytesIO()
encoder = avro.io.BinaryEncoder(bytes_writer)
writer.write({"name": "Alyssa", "favorite_number": 256}, encoder)
writer.write({"name": "Ben", "favorite_number": 7, "favorite_color": "red"}, encoder)

raw_bytes = bytes_writer.getvalue()
print(len(raw_bytes))
print(type(raw_bytes))

bytes_reader = io.BytesIO(raw_bytes)
decoder = avro.io.BinaryDecoder(bytes_reader)
reader = avro.io.DatumReader(schema)
user1 = reader.read(decoder)
user2 = reader.read(decoder)

print(user1)
print(user2)

Ответ 2

Используя библиотеку import avro, мы не можем написать файл avro со схемой.

Чтобы преодолеть эту проблему, используйте fastavro например,

import io
import fastavro
data = [{"name": "Shravan", "favorite_number": 256}, {"name": "Ram", "favorite_number": 7, "favorite_color": "red"}]
bytes_writer = io.BytesIO()
fastavro.writer(bytes_writer, get_avro_schema(), data)
print(bytes_writer.get_value())