Encode an object with Avro to a byte array in Python

后端 未结 2 593
故里飘歌
故里飘歌 2020-12-05 11:57

In python 2.7, using Avro, I\'d like to encode an object to a byte array.

All examples I\'ve found write to a file.

I\'ve tried using io.BytesIO() but this g

相关标签:
2条回答
  • 2020-12-05 12:37

    Your question helped me figure things out, so thanks. Here's a simple python example based on the python example in the docs:

    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)
    
    0 讨论(0)
  • 2020-12-05 12:40

    Using import avro library we can't write the avro file with the schema.

    To overcome this problem use fastavro e.g.

    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())
    
    0 讨论(0)
提交回复
热议问题