Как преобразовать строку JSON в Avro в Python?

Есть ли способ преобразовать строку JSON в Avro без определения схемы в Python? Или это то, что может обработать только Java?

2 ответа

Решение

Apache Avro™ 1.7.6 Начало работы (Python):

import avro.schema
avro.schema.parse(json_schema_string)

Недавно у меня возникла та же проблема, и я закончил тем, что разработал пакет python, который может принимать любую структуру данных python, включая проанализированный JSON, и сохранять ее в Avro без необходимости выделенной схемы.

Я проверил это для Python 3.

Вы можете установить его как pip3 install rec-avro или посмотрите код и документы по адресу https://github.com/bmizhen/rec-avro

Пример использования:

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()

Для преобразования строки JSON в объекты json используйте json.loads('{"a":"b"}')

Это должно помочь:

b = BytesIO(b'some message')
reader = DataFileReader(b, DatumReader())

Для получения дополнительной информации ознакомьтесь с этим Avro Python Guide.

Другие вопросы по тегам