Как мне заставить fastavro поддерживать логические типы? - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь использовать логический тип в Avro с библиотекой Python fastavro для чтения и записи, но аннотация logicalType, похоже, не имеет никакого эффекта. Код ниже взят из fastavro страница ; Я изменил поле time в определении схемы, пометив его логическим типом time-millis в соответствии с текущей спецификацией Avro . (Кстати, я видел, как люди используют TIMESTAMP_MILLIS , но я не знаю почему, поскольку на странице Avro есть time-millis .) Когда я запускаю этот код, вывод Я вижу, что в stdout точно так же, как вывод того же кода без аннотации логического типа. Я ожидал увидеть что-то похожее на время - например, 13: 14: 15.1234 . Однако на странице fastavro , упомянутой выше, утверждается, что fastavro теперь поддерживает логические типы Avro. Как я могу заставить это сделать это? Спасибо!

from fastavro import writer, reader, parse_schema

schema = {
    'doc': 'A weather reading.',
    'name': 'Weather',
    'namespace': 'test',
    'type': 'record',
    'fields': [
        {'name': 'station', 'type': 'string'},
        {'name': 'time', 'type': 'int', 'logicalType': 'time-millis'},
        {'name': 'temp', 'type': 'int'},
    ],
}
parsed_schema = parse_schema(schema)

# 'records' can be an iterable (including generator)
records = [
    {u'station': u'011990-99999', u'temp': 0, u'time': 1433269388},
    {u'station': u'011990-99999', u'temp': 22, u'time': 1433270389},
    {u'station': u'011990-99999', u'temp': -11, u'time': 1433273379},
    {u'station': u'012650-99999', u'temp': 111, u'time': 1433275478},
]

# Writing
with open('weather.avro', 'wb') as out:
    writer(out, parsed_schema, records)

# Reading
with open('weather.avro', 'rb') as fo:
    for record in reader(fo):
        print(record)

Вывод на стандартный вывод, независимо от того, присутствует или удалена аннотация logicalType, одинаков:

'station': '011990-99999', 'time' : 1433269388, 'temp': 0}

{'station': '011990-99999', 'time': 1433270389, 'temp': 22}
{'station': '011990-99999', 'time': 1433273379, 'temp': -11}
{'station': '012650-99999', 'time': 1433275478, 'temp': 111}

Я вижу, что схемы в выходных файлах отличаются между двумя версиями:

С указанием logicalType:

"fields": [{"name": "station", "type": "string"}, {"logicalType": "time-millis", "name": "time", "type": "int"}, {"name": "temp", "type": "int"}]

Без указания logicalType:

"fields": [{"name": "station", "type": "string"}, {"name": "time", "type": "int"}, {"name": "temp", "type": "int"}]

Но это не влияет на вывод.

1 Ответ

0 голосов
/ 25 марта 2020

ОК, ответ таков: спецификация типа должна рассматриваться как сама схема, поэтому синтаксис другой. В приведенном выше примере схема должна быть определена следующим образом:

schema = {'do c': 'Показания погоды.', 'Name': 'Weather', 'namespace': 'test ',' type ':' record ',' fields ': [{' name ':' station ',' type ':' string '}, {' name ':' time ',' type ': {' type ' : 'int', 'logicType': 'time-millis'}}, {'name': 'temp', 'type': 'int'},],

...