2014-05-12 19 views
9

In python 2.7, utilizzando Avro, mi piacerebbe codificare un oggetto in un array di byte.Codifica un oggetto con Avro in un array di byte in Python

Tutti gli esempi che ho trovato scrivono in un file.

Ho provato con io.BytesIO(), ma questo dà:

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

di esempio utilizzando io.BytesIO

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

risposta

18

La sua domanda mi ha aiutato a capire le cose, quindi grazie. Ecco un semplice esempio pitone sull'esempio pitone nella documentazione:

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) 
+1

Se si desidera eseguire questo sotto Python 3 cambiamento "dello schema = avro.schema.parse (test_schema)" a "schema = avro.schema. Parse (test_schema) " – JamesC

+0

domanda veloce, quando provo a scrivere questi flussi di byte in file e poi li salviamo su hdf, il comando dfs-text di hdfs non è in grado di convertirli di nuovo in stringa, apparentemente mi manca qualsiasi passaggio precedente scrivere lo stream in file. – chandank

Problemi correlati