fastavro - конвертировать json файл в файл avro - PullRequest
0 голосов
/ 27 марта 2020

Немного нового для avro & python.

Я пытаюсь выполнить простое преобразование в avro с помощью библиотеки fastavro, так как скорость нативной apache avro библиотеки слишком мала.

Я хочу:

1. Возьмите файл json 2. Конвертируйте данные в avro.

Моя проблема в том, что мой json не в правильном формате записи, чтобы быть преобразован в авро. Я даже попытался поместить мой json в строковую переменную и сделать его похожим на синтаксис, который они имеют на сайте @ https://fastavro.readthedocs.io/en/latest/writer.html:

    {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},

Вот мой код:

from fastavro import json_writer, parse_schema, writer
import json

key = "test.json"
schemaFileName = "test_schema.avsc"
with open(r'C:/Path/to/file' + schemaFileName) as sc:
    w = json.load(sc)

schema = parse_schema(w)

with open(r'C:/Path/to/file/' + key) as js:
    x=json.load(js)

with open('C:/Path/to/file/output.avro', 'wb') as out:
    writer(out, schema,x, codec='deflate')

Вот что я получу в качестве вывода:

  File "avropython.py", line 26, in <module>
    writer(out, schema,x, codec='deflate')
  File "fastavro\_write.pyx", line 608, in fastavro._write.writer
ValueError: "records" argument should be an iterable, not dict

Мой json файл и схема, соответственно:

  "joined": false,
  "toward": {
    "selection": "dress",
    "near": true,
    "shoulder": false,
    "fine": -109780201.3804388,
    "pet": {
      "stood": "saddle",
      "live": false,
      "leather": false,
      "tube": false,
      "over": false,
      "impossible": true
    },
    "higher": false
  },
  "wear": true,
  "asleep": "door",
  "connected": true,
  "stairs": -1195512399.5000324
}
{
  "name": "MyClass",
  "type": "record",
  "namespace": "com.acme.avro",
  "fields": [
    {
      "name": "joined",
      "type": "boolean"
    },
    {
      "name": "toward",
      "type": {
        "name": "toward",
        "type": "record",
        "fields": [
          {
            "name": "selection",
            "type": "string"
          },
          {
            "name": "near",
            "type": "boolean"
          },
          {
            "name": "shoulder",
            "type": "boolean"
          },
          {
            "name": "fine",
            "type": "float"
          },
          {
            "name": "pet",
            "type": {
              "name": "pet",
              "type": "record",
              "fields": [
                {
                  "name": "stood",
                  "type": "string"
                },
                {
                  "name": "live",
                  "type": "boolean"
                },
                {
                  "name": "leather",
                  "type": "boolean"
                },
                {
                  "name": "tube",
                  "type": "boolean"
                },
                {
                  "name": "over",
                  "type": "boolean"
                },
                {
                  "name": "impossible",
                  "type": "boolean"
                }
              ]
            }
          },
          {
            "name": "higher",
            "type": "boolean"
          }
        ]
      }
    },
    {
      "name": "wear",
      "type": "boolean"
    },
    {
      "name": "asleep",
      "type": "string"
    },
    {
      "name": "connected",
      "type": "boolean"
    },
    {
      "name": "stairs",
      "type": "float"
    }
  ]
}

Если кто-нибудь может помочь мне, это было бы очень признательно !!

1 Ответ

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

Как упоминалось в ошибке ValueError: "records" argument should be an iterable, not dict, проблема в том, что при вызове writer аргумент для записей должен быть итеративным. Одним из способов решения этой проблемы является изменение вашей последней строки на writer(out, schema, [x], codec='deflate')

В качестве альтернативы, есть schemaless_writer, который можно использовать только для записи одной записи: https://fastavro.readthedocs.io/en/latest/writer.html#fastavro ._ write_py.schemaless_writer

...