Как мне заставить fastavro поддерживать логические типы?
Я пытаюсь использовать логический тип в Avro с библиотекой Python fastavro для чтения и записи, ноlogicalType
аннотации, похоже, вообще не действуют. Код ниже взят со страницы fastavro; Я изменил поле времени в определении схемы, аннотировав его логическим типом time-millis, в соответствии с текущей спецификацией Avro. (Кстати, я видел, как люди используют TIMESTAMP_MILLIS, но я не знаю почему, поскольку на странице Avro указано время в миллисекундах.) Когда я запускаю этот код, вывод, который я вижу в stdout, точно такой же, как вывод тот же код без аннотации логического типа. Я ожидал увидеть что-то похожее на время - например, 13:14:15.1234. И все же фаставро На указанной выше странице утверждается, что 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 ответ
Хорошо, ответ состоит в том, что спецификацию типа нужно рассматривать как схему, поэтому синтаксис отличается. В приведенном выше примере схема должна быть определена следующим образом:
schema = {'doc': 'Прогноз погоды.', 'name': 'Погода', 'namespace': 'test', 'type': 'record', 'fields': [ {'name': 'station', 'type': 'string'}, {'name': 'time', 'type': {'type': 'int', 'logicType': 'time-millis'}}, {'name': 'temp', 'type': 'int'}, ],