Python中的Json到avro

kx1ctssn  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(131)

我正在尝试使用以下代码将JSON转换为Avro:

from fastavro import writer, reader, schema
from rec_avro import to_rec_avro_destructive, from_rec_avro_destructive, rec_avro_schema

avro_objects = (to_rec_avro_destructive(rec) for rec in all_obj[:100])

with open('json_in_avro.avro', 'wb') as f_out:
    writer(f_out, schema.parse_schema(rec_avro_schema()), avro_objects)

字符串
它可以正常工作,但是all_obj中的JSON模式是这样的

{
'Date': '2023-07-16',
'Url': 'google.pt',
'Item': {'Title': 'abababab',
'Id': '28e3c5n',
'DedupId': None,
'ImageHash': None,
'Attributes': {'Cost': None,
  'Area': None},
'PropertyDetail':  []}
 }


对此:

{
'Date': '2023-07-16',
'Url': 'google.pt',
'Item': {'_': {'Title': 'abababab',
'Id': '28e3c5n',
'DedupId': None,
'ImageHash': None,
'Attributes': {'_': {'Cost': None,
  'Area': None}},
'PropertyDetail': {'_': []}}
 }


为什么它似乎创建了这些'_'项?
谢谢你的帮助!

ftf50wuq

ftf50wuq1#

_来自rec_avro库。但是,只要为数据定义了模式(应该这样做),就不需要使用该库。
我不知道你的模式的所有细节,但我做了最好的猜测,这里有一个脚本,应该非常接近你正在寻找的东西:

import fastavro

schema = {
  "name": "YourName",
  "type": "record",
  "fields": [
    {"name": "Date", "type": "string"},
    {"name": "Url", "type": "string"},
    {
      "name": "Item",
      "type": {
        "type": "record",
        "name": "YourItem",
        "fields": [
          {"name": "Title", "type": "string"},
          {"name": "Id", "type": ["null", "string"]},
          {"name": "DedupId", "type": ["null", "string"]},
          {"name": "ImageHash", "type": ["null", "string"]},
          {
           "name": "Attributes",
            "type": {
              "type": "record",
              "name": "YourAttributes",
              "fields": [
                {"name": "Cost", "type": ["null", "string"]},
                {"name": "Area", "type": ["null", "string"]},
              ],
            },
          },
          {"name": "PropertyDetail", "type": {"type": "array", "items": "string"}},
        ],
      },
    },
  ]
}

records = [
    {
        'Date': '2023-07-16',
        'Url': 'google.pt',
        'Item': {
            'Title': 'abababab',
            'Id': '28e3c5n',
            'DedupId': None,
            'ImageHash': None,
            'Attributes': {
                'Cost': None,
                'Area': None,
            },
            'PropertyDetail':  [],
        }
    }
]

with open('json_in_avro.avro', 'wb') as fp:
    fastavro.writer(fp, schema, records)

字符串

相关问题