Как разобрать этот жесткий JSON для DataFrame в Python? - PullRequest
0 голосов
/ 08 октября 2019

еще один вопрос по этой теме.

В этом сообществе есть несколько вопросов и ответов на них:

  1. как преобразовать json в csv в python
  2. Преобразование JSON в CSV с использованием Python
  3. Преобразование Python JSON в CSV
  4. Преобразование JSON в CSV с помощью Python3
  5. Это следует ...

Но я думаю, что в этом случае это не сработает для этого жесткого json:

МОЙ ДЖОНСОН:

    {
   "took":32,
   "timed_out":false,
   "_shards":{
      "total":4,
      "successful":4,
      "skipped":0,
      "failed":0
   },
   "hits":{
      "total":{
         "value":94,
         "relation":"eq"
      },
      "max_score":"None",
      "hits":[

      ]
   },
   "aggregations":{
      "hostname":{
         "doc_count_error_upper_bound":0,
         "sum_other_doc_count":0,
         "buckets":[
            {
               "key":"396",
               "doc_count":47,
               "process_name":{
                  "doc_count_error_upper_bound":0,
                  "sum_other_doc_count":16,
                  "buckets":[
                     {
                        "key":"accounts-daemon",
                        "doc_count":2,
                        "process_state":{
                           "doc_count_error_upper_bound":0,
                           "sum_other_doc_count":0,
                           "buckets":[
                              {
                                 "key":"sleeping",
                                 "doc_count":2,
                                 "process_pid":{
                                    "doc_count_error_upper_bound":0,
                                    "sum_other_doc_count":0,
                                    "buckets":[
                                       {
                                          "key":1092,
                                          "doc_count":2,
                                          "process_ppid":{
                                             "doc_count_error_upper_bound":0,
                                             "sum_other_doc_count":0,
                                             "buckets":[
                                                {
                                                   "key":1,
                                                   "doc_count":2,
                                                   "process_pgid":{
                                                      "doc_count_error_upper_bound":0,
                                                      "sum_other_doc_count":0,
                                                      "buckets":[
                                                         {
                                                            "key":1092,
                                                            "doc_count":2,
                                                            "process_cmdline":{
                                                               "doc_count_error_upper_bound":0,
                                                               "sum_other_doc_count":0,
                                                               "buckets":[
                                                                  {
                                                                     "key":"/usr/lib/accountsservice/accounts-daemon",
                                                                     "doc_count":2,
                                                                     "process_username":{
                                                                        "doc_count_error_upper_bound":0,
                                                                        "sum_other_doc_count":0,
                                                                        "buckets":[
                                                                           {
                                                                              "key":"root",
                                                                              "doc_count":2,
                                                                              "process_cwd":{
                                                                                 "doc_count_error_upper_bound":0,
                                                                                 "sum_other_doc_count":0,
                                                                                 "buckets":[
                                                                                    {
                                                                                       "key":"/",
                                                                                       "doc_count":2,
                                                                                       "process_cpu_start_time":{
                                                                                          "doc_count_error_upper_bound":0,
                                                                                          "sum_other_doc_count":0,
                                                                                          "buckets":[
                                                                                             {
                                                                                                "key":1570456346000,
                                                                                                "key_as_string":"2019-10-07T13:52:26.000Z",
                                                                                                "doc_count":2,
                                                                                                "process_fd_limit_hard":{
                                                                                                   "value":4096.0
                                                                                                },
                                                                                                "process_fd_open":{
                                                                                                   "value":8.0
                                                                                                },
                                                                                                "process_memory_size":{
                                                                                                   "value":281055232.0
                                                                                                },
                                                                                                "process_memory_rss_bytes":{
                                                                                                   "value":6168576.0
                                                                                                },
                                                                                                "process_memory_share":{
                                                                                                   "value":5464064.0
                                                                                                },
                                                                                                "process_cpu_total_pct":{
                                                                                                   "value":0.0005
                                                                                                },
                                                                                                "process_fd_limit_soft":{
                                                                                                   "value":1024.0
                                                                                                },
                                                                                                "process_cpu_system_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_user_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_total_norm_pct":{
                                                                                                   "value":0.0005
                                                                                                },
                                                                                                "process_cpu_total_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_total_value":{
                                                                                                   "value":18775.0
                                                                                                }
                                                                                             }
                                                                                          ]
                                                                                       }
                                                                                    }
                                                                                 ]
                                                                              }
                                                                           }
                                                                        ]
                                                                     }
                                                                  }
                                                               ]
                                                            }
                                                         }
                                                      ]
                                                   }
                                                }
                                             ]
                                          }
                                       }
                                    ]
                                 }
                              }
                           ]
                        }
                     }
                  ]
               }
            },
            {
               "key":"961",
               "doc_count":47,
               "process_name":{
                  "doc_count_error_upper_bound":0,
                  "sum_other_doc_count":16,
                  "buckets":[
                     {
                        "key":"accounts-daemon",
                        "doc_count":2,
                        "process_state":{
                           "doc_count_error_upper_bound":0,
                           "sum_other_doc_count":0,
                           "buckets":[
                              {
                                 "key":"sleeping",
                                 "doc_count":2,
                                 "process_pid":{
                                    "doc_count_error_upper_bound":0,
                                    "sum_other_doc_count":0,
                                    "buckets":[
                                       {
                                          "key":1070,
                                          "doc_count":2,
                                          "process_ppid":{
                                             "doc_count_error_upper_bound":0,
                                             "sum_other_doc_count":0,
                                             "buckets":[
                                                {
                                                   "key":1,
                                                   "doc_count":2,
                                                   "process_pgid":{
                                                      "doc_count_error_upper_bound":0,
                                                      "sum_other_doc_count":0,
                                                      "buckets":[
                                                         {
                                                            "key":1070,
                                                            "doc_count":2,
                                                            "process_cmdline":{
                                                               "doc_count_error_upper_bound":0,
                                                               "sum_other_doc_count":0,
                                                               "buckets":[
                                                                  {
                                                                     "key":"/usr/lib/accountsservice/accounts-daemon",
                                                                     "doc_count":2,
                                                                     "process_username":{
                                                                        "doc_count_error_upper_bound":0,
                                                                        "sum_other_doc_count":0,
                                                                        "buckets":[
                                                                           {
                                                                              "key":"root",
                                                                              "doc_count":2,
                                                                              "process_cwd":{
                                                                                 "doc_count_error_upper_bound":0,
                                                                                 "sum_other_doc_count":0,
                                                                                 "buckets":[
                                                                                    {
                                                                                       "key":"/",
                                                                                       "doc_count":2,
                                                                                       "process_cpu_start_time":{
                                                                                          "doc_count_error_upper_bound":0,
                                                                                          "sum_other_doc_count":0,
                                                                                          "buckets":[
                                                                                             {
                                                                                                "key":1570450883000,
                                                                                                "key_as_string":"2019-10-07T12:21:23.000Z",
                                                                                                "doc_count":2,
                                                                                                "process_fd_limit_hard":{
                                                                                                   "value":4096.0
                                                                                                },
                                                                                                "process_fd_open":{
                                                                                                   "value":8.0
                                                                                                },
                                                                                                "process_memory_size":{
                                                                                                   "value":281153536.0
                                                                                                },
                                                                                                "process_memory_rss_bytes":{
                                                                                                   "value":5992448.0
                                                                                                },
                                                                                                "process_memory_share":{
                                                                                                   "value":5279744.0
                                                                                                },
                                                                                                "process_cpu_total_pct":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_fd_limit_soft":{
                                                                                                   "value":1024.0
                                                                                                },
                                                                                                "process_cpu_system_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_user_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_total_norm_pct":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_total_ticks":{
                                                                                                   "value":0.0
                                                                                                },
                                                                                                "process_cpu_total_value":{
                                                                                                   "value":13410.0
                                                                                                }
                                                                                             }
                                                                                          ]
                                                                                       }
                                                                                    }
                                                                                 ]
                                                                              }
                                                                           }
                                                                        ]
                                                                     }
                                                                  }
                                                               ]
                                                            }
                                                         }
                                                      ]
                                                   }
                                                }
                                             ]
                                          }
                                       }
                                    ]
                                 }
                              }
                           ]
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}

Я перепробовал почти все и протянул руку, чтобы разобрать его с помощью ужасного многопетлевого кода, но я думаю, что есть более простой способ сделать это, но нет поста в этомСообщество уже помогло мне.

Не могли бы вы помочь мне получить что-то вроде этого?:

Мой результат (неполный):

   hostname     process_name process_state  ...  process_username  process_cwd    process_cpu_start_time
0       396  accounts-daemon      sleeping  ...              root            /  2019-10-07T13:52:26.000Z
1       396           iscsid      sleeping  ...              root            /  2019-10-07T13:52:27.000Z
2       396           iscsid      sleeping  ...              root            /  2019-10-07T13:52:28.000Z
3       396      ksoftirqd/0      sleeping  ...              root            /  2019-10-07T13:52:28.000Z
4       396      kworker/0:1      sleeping  ...              root            /  2019-10-07T13:52:28.000Z
..      ...              ...           ...  ...               ...          ...                       ...
25      961          polkitd      sleeping  ...              root            /  2019-10-07T12:21:31.000Z
26      961        rcu_sched      sleeping  ...              root            /  2019-10-07T12:21:31.000Z
27      961          systemd      sleeping  ...              root            /  2019-10-07T12:20:24.000Z
28      961  systemd-journal      sleeping  ...              root            /  2019-10-07T12:20:38.000Z
29      961  unattended-upgr      sleeping  ...              root            /  2019-10-07T12:21:26.000Z

Я знаю, что это нелегко, поэтому я буду признателен за любую помощь.

Заранее спасибо.

1 Ответ

0 голосов
/ 09 октября 2019

Идея

Основная идея заключается в навигации по структуре вашего объекта JSON. Чтобы сделать программу читабельной, я предложил 2 функции, которые выполняют эту навигацию и добавляют ключи по пути спуска в список (содержимое текущей строки).

Функции для навигации по объекту JSON

Функция 1:

def dig(dct, path):
    ret = dct
    for step in path.split('.'):
        if step not in ret:
            print(f'**** No {step} element.')
            return None
        ret = ret[step]
        if isinstance(ret, list):
            ret = ret[0]
    return ret

Эта функция «копает» dct - словарь (объект JSON ) вдоль пути (строка, разделенная точкой). Дополнительная деталь заключается в том, что если целевой подобъект (к которому спустилась функция) представляет собой список , то существует дополнительный шаг «спуска», а именно функция опускается до первого элемента этого списка. Возвращаемым значением является «окончательный» подобъект после всех нисходящих.

Функция 2:

def dig2(dct, step, res, key='key'):
    dct = dig(dct, step + '.buckets')
    res.append(dct[key])
    return(dct)

Параметры:

  • dct - исходный словарь,
  • step - первый шаг пути к спуску,
  • res -список результатов, к которому добавляется ключ после спуска,
  • ключ - имя ключа для чтения из целевого подобъекта.

ThisФункция ускоряет навигацию вниз по исходному объекту. Вы указываете только первый шаг , и эта функция опускается на один шаг глубже (до сегментов ). Затем к res добавляется клавиша , найденная на этом уровне.

Возвращаемое значение снова является «окончательным» подобъектом, который используется для выполнения дальнейших спусков. .

Чтение исходного файла JSON

Чтобы прочитать вашу строку JSON, я сохранил ее в файле и прочитал следующим образом:

with open('input.json') as json_file:
    data = json.load(json_file)

Список шагов

Список шагов для навигации по исходному объекту выглядит следующим образом:

steps = ['hostname', 'process_name', 'process_state', 'process_pid',
    'process_ppid', 'process_pgid', 'process_cmdline',
    'process_username', 'process_cwd', 'process_cpu_start_time']

Этот список также является списком имен столбцов в результирующем кадре данных.

Основная программа

tbl = []
for buck in dig(data, 'aggregations.hostname')['buckets']:
    res = [buck['key']]
    for step in steps[1:-1]:
        buck = dig2(buck, step, res)
    dig2(buck, steps[-1], res, 'key_as_string')
    tbl.append(res)
result = pd.DataFrame(tbl, columns=steps)

Сначала мы создаем tbl - пустой список, в который будут собираться данные для последующих строк.

Затем для возврата в ... работает с каждым сегментом в пределах aggregations.hostname .

Первый элемент результата для текущей строки - key от текущего ведро .

После этого для шага в шагах [1: -1] копает в следующие шаги, исключая последний, и объявлениедс каждый ключ к списку результатов.

Последний шаг спуска находится вне этого цикла, потому что на этот раз добавляемый ключ - key_as_string и, наконец, res (данные для текущей строки) добавляются к tbl .

После цикла создается результирующий DataFrame.

В качестве исходного объекта JSONвключенный в ваше сообщение содержит только 2 сегмента, этот DataFrame содержит только 2 строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...