2014-05-12 6 views
9

In Python 2.7, mit Avro, möchte ich ein Objekt zu einem Byte-Array zu kodieren.Kodieren Sie ein Objekt mit Avro zu einem Byte-Array in Python

Alle Beispiele, die ich gefunden habe, schreiben in eine Datei.

Ich habe versucht mit io.BytesIO(), aber dies gibt:

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

Probe io.BytesIO mit

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

Antwort

18

Ihre Frage mich Dinge Figur geholfen, so danke. Hier ist ein einfaches Python-Beispiel basiert auf dem Python-Beispiel in der Dokumentation:

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

Wenn Sie dies unter Python 3 Änderung ausgeführt werden soll "schema = avro.schema.parse (test_schema)" auf „Schema = avro.schema. Parse (test_schema) " – JamesC

+0

schnelle Frage, wenn ich versuche, diesen Strom von Bytes in Datei zu schreiben und dann auf hdfs zu speichern, der hdfs dfs -text Befehl ist nicht in der Lage, es wieder in String zu konvertieren, anscheinend fehlt mir irgendeinen Schritt vorher den Stream in eine Datei schreiben. – chandank