Is there a way to convert a JSON string to an Avro without a schema definition in Python? Or is this something only Java can handle?
Asked
Active
Viewed 2.2k times
3 Answers
11
I recently had the same problem, and I ended up developing a python package that can take any python data structure, including parsed JSON and store it in Avro without a need for a dedicated schema.
I tested it for python 3.
You can install it as pip3 install rec-avro
or see the code and docs at https://github.com/bmizhen/rec-avro
Usage Example:
from fastavro import writer, reader, schema
from rec_avro import to_rec_avro_destructive, from_rec_avro_destructive, rec_avro_schema
def json_objects():
return [{'a': 'a'}, {'b':'b'}]
# For efficiency, to_rec_avro_destructive() destroys rec, and reuses it's
# data structures to construct avro_objects
avro_objects = (to_rec_avro_destructive(rec) for rec in json_objects())
# store records in avro
with open('json_in_avro.avro', 'wb') as f_out:
writer(f_out, schema.parse_schema(rec_avro_schema()), avro_objects)
#load records from avro
with open('json_in_avro.avro', 'rb') as f_in:
# For efficiency, from_rec_avro_destructive(rec) destroys rec, and
# reuses it's data structures to construct it's output
loaded_json = [from_rec_avro_destructive(rec) for rec in reader(f_in)]
assert loaded_json == json_objects()
To convert a JSON string to json objects use json.loads('{"a":"b"}')

boriska
- 171
- 1
- 8
0
This should help:
b = BytesIO(b'some message')
reader = DataFileReader(b, DatumReader())
For more information take a look at this Avro Python Guide.

Peter Mortensen
- 30,738
- 21
- 105
- 131

North-Pole
- 610
- 4
- 13
-5
Apache Avro™ 1.7.6 Getting Started (Python):
import avro.schema
avro.schema.parse(json_schema_string)

sds
- 58,617
- 29
- 161
- 278
-
9This parses an avro schema, not a serialized avro document. – aradil Jun 22 '16 at 19:52