Python / PySpark анализирует строку JSON с пронумерованными атрибутами - PullRequest
2 голосов
/ 01 июля 2019

Мне нужно хранить строки JSON, подобные приведенной ниже, в каком-то формате, отличном от открытого текста (например, parquet):

{
  "vidName": "Foo",
  "vidInfo.0.size.length": 10,
  "vidInfo.0.size.width": 10,
  "vidInfo.0.quality": "Good",
  "vidInfo.1.size.length": 7,
  "vidInfo.1.size.width": 3,
  "vidInfo.1.quality": "Bad",
  "vidInfo.2.size.length": 10,
  "vidInfo.2.size.width": 2,
  "vidInfo.2.quality": "Excelent"
}

Не существует известной границы для индекса vidInfo (может быть 10, 20).Таким образом, я хочу либо иметь vidInfos в массиве, либо разбить такой объект JSON на несколько меньших объектов.

Я нашел этот вопрос: Разбор PHP JSON (числовые атрибуты?) Но это вPHP, который я не совсем понимаю.И я не уверен, что это то же самое, что мне нужно.

Промежуточные данные должны быть примерно такими:

{
  "vidName": "Foo",
  "vidInfo": [
    {
      "id": 0,
      "size": {
        "length": 10,
        "width": 10
      },
      "quality": "Good"
    },
    {
      "id": 1,
      "size": {
        "length": 7,
        "width": 3
      },
      "quality": "Bad"
    },
    {
      "id": 2,
      "size": {
        "length": 10,
        "width": 2
      },
      "quality": "Excelent"
    }
  ]
}

или такими:

{
  "vidName": "Foo",
  "vidInfo": [
    {
      "size": {
        "length": 10,
        "width": 10
      },
      "quality": "Good"
    },
    {
      "size": {
        "length": 7,
        "width": 3
      },
      "quality": "Bad"
    },
    {
      "size": {
        "length": 10,
        "width": 2
      },
      "quality": "Excelent"
    }
  ]
}

Я застрял, и мне нужно несколько советов, чтобы двигаться дальше.Не могли бы вы помочь?Большое спасибо за вашу помощь.

1 Ответ

1 голос
/ 01 июля 2019

Я нашел эту библиотеку https://github.com/amirziai/flatten, которая добивается цели.

In [154]: some_json = {
 ...:   "vidName": "Foo",
 ...:   "vidInfo.0.size.length": 10,
 ...:   "vidInfo.0.size.width": 10,
 ...:   "vidInfo.0.quality": "Good",
 ...:   "vidInfo.1.size.length": 7,
 ...:   "vidInfo.1.size.width": 3,
 ...:   "vidInfo.1.quality": "Bad",
 ...:   "vidInfo.2.size.length": 10,
 ...:   "vidInfo.2.size.width": 2,
 ...:   "vidInfo.2.quality": "Excelent"
 ...: }

In [155]: some_json
Out[155]:
{'vidName': 'Foo',
 'vidInfo.0.size.length': 10,
 'vidInfo.0.size.width': 10,
 'vidInfo.0.quality': 'Good',
 'vidInfo.1.size.length': 7,
 'vidInfo.1.size.width': 3,
 'vidInfo.1.quality': 'Bad',
 'vidInfo.2.size.length': 10,
 'vidInfo.2.size.width': 2,
 'vidInfo.2.quality': 'Excelent'}

In [156]: from flatten_json import unflatten_list
     ...: import json 
     ...: nested_json = unflatten_list(json.loads(json.dumps(some_json)), '.')

In [157]: nested_json
Out[157]:
{'vidInfo': [{'quality': 'Good', 'size': {'length': 10, 'width': 10}},
  {'quality': 'Bad', 'size': {'length': 7, 'width': 3}},
  {'quality': 'Excelent', 'size': {'length': 10, 'width': 2}}],
 'vidName': 'Foo'}
...