python - десериализация логического типа avro-байта от десятичного к десятичному - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь прочитать файл Avro, используя библиотеку python avro (python 2).Когда я использую следующий код:

import avro.schema
from avro.datafile import DataFileReader, DataFileWriter
from avro.io import DatumReader, DatumWriter, BinaryDecoder
reader = DataFileReader(open("filename.avro", "rb"), DatumReader())
schema = reader.meta

Затем он правильно читает каждый столбец, за исключением одного, который остается в байтах, а не ожидаемые десятичные значения.

Как преобразовать этот столбецк ожидаемым десятичным значениям?Я заметил, что метаданные файла определяют столбец как «тип»: «байты», но «логический тип»: «десятичный»

Я публикую ниже метаданные для этого столбца, а также байтовые значения (ожидаемые фактическиевсе значения кратны 1000 меньше 25 000. Файл был создан с использованием Kafka.

Метаданные:

 {
                            "name": "amount",
                            "type": {
                                "type": "bytes",
                                "scale": 8,
                                "precision": 20,
                                "connect.version": 1,
                                "connect.parameters": {
                                    "scale": "8",
                                    "connect.decimal.precision": "20"
                                },
                                "connect.name": "org.apache.kafka.connect.data.Decimal",
                                "logicalType": "decimal"
                            }
                        }

Значения байтов:

'E\xd9d\xb8\x00'
'\x00\xe8\xd4\xa5\x10\x00'
'\x01\x17e\x92\xe0\x00'
'\x01\x17e\x92\xe0\x00'

Ожидаемые значения:

3,000.00
10,000.00
12,000.00
5,000.00

Мне нужно использовать это в лямбда-функции, развернутой в AWS, поэтому я не могу использовать fast_avro или другие библиотеки, использующие C, ачем чистый Python.

Смотрите ссылки ниже: https://pypi.org/project/fastavro/ https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-libraries.html

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Для этого вам нужно использовать библиотеку fastavro. Обе библиотеки avro и avro-python3 не поддерживают логические типы на момент публикации этого сообщения.

0 голосов
/ 11 сентября 2018

По какой-то причине пакет fastavro работает по умолчанию для того же файла. Я закончил тем, что использовал код ниже. Все еще не уверен, есть ли способ решить эту проблему напрямую с помощью библиотеки avro или десериализовать результаты, опубликованные в вопросе выше.

import fastavro
with open("filename.avro", 'rb') as fo: 
    for record in fastavro.reader(fo): 
        print(record) 
...