Как я могу прочитать глубоко вложенные JSON в фрейм данных? - PullRequest
0 голосов
/ 05 мая 2020

У меня много JSON запросов, которые я хочу визуализировать. Запросы JSON сохраняются в файлах .blob. Проблема в том, что запросы JSON глубоко вложены. Я не могу найти эффективный фрагмент кода для записи всех данных в фрейм данных.

Это мой текущий код, он работает, но не настолько эффективен ..

path_to_blob = '/mnt/data/'
read_files = glob.iglob(os.path.join(path_to_blob, "**/*.blob"), recursive=True)

np_array_values = []
for files in read_files:
    data = [json.loads(line) for line in open(files, encoding="utf8")]

    all_data = json_normalize(data)
    request_data = json_normalize(data, record_path=['request'])
    dataframes = [request_data, all_data]
    dataset = pd.concat(dataframes, axis=1)

    np_array_values.append(dataset)
dataframe = pd.concat(np_array_values)

И это один из запросов:

{"request":[{"id":"12345678","name":"GET navigation/Index","count":123,"responseCode":123,"success":true,"url":"http://server1.test.com/12345678","urlData":{"base":"/navigation/123456","host":"server1.test.com","hashTag":"","protocol":"http"},"durationMetric":{"value":12345.0,"count":123.0,"min":12345.0,"max":12345.0,"stdDev":0.0,"sampledValue":12345.0}}],"internal":{"data":{"id":"12345678","documentVersion":"123.0"}},"context":{"data":{"eventTime":"2020-5-5","isSynthetic":false,"samplingRate":123.0},"cloud":{},"device":{"type":"PC","roleName":"ROLENAME","roleInstance":"SERVERNAME","screenResolution":{}},"session":{"isFirst":false},"operation":{"id":"12345678=","parentId":"12345678=","name":"GET navigation/url"},"location":{"clientip":"0.0.0.0","continent":"Europe","country":"Netherlands"},"custom":{"dimensions":[{"_MS.ProcessedByMetricExtractors":"(Name:'Requests', Ver:'123.0')"},{"InstanceKey":"12345678"}]}}}

Я недавно прочитал кое-что о dask, и кажется разумным использовать dask, поскольку набор данных составляет 1,2 ТБ. Может кто-нибудь сказать мне, как получить эти вложенные запросы JSON в DataFrame?

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

1 Ответ

0 голосов
/ 05 мая 2020

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

json .loads ()

Этот код:

import json
from pprint import pprint

with open("test.json", "r") as rf:
    jx = rf.read()
    jx = json.loads(jx)
pprint(jx)

Возвращает вас в виде словаря:

{'context': {'cloud': {},
             'custom': {'dimensions': [{'_MS.ProcessedByMetricExtractors': "(Name:'Requests', "
                                                                           "Ver:'123.0')"},
                                       {'InstanceKey': '12345678'}]},
             'data': {'eventTime': '2020-5-5',
                      'isSynthetic': False,
                      'samplingRate': 123.0},
             'device': {'roleInstance': 'SERVERNAME',
                        'roleName': 'ROLENAME',
                        'screenResolution': {},
                        'type': 'PC'},
             'location': {'clientip': '0.0.0.0',
                          'continent': 'Europe',
                          'country': 'Netherlands'},
             'operation': {'id': '12345678=',
                           'name': 'GET navigation/url',
                           'parentId': '12345678='},
             'session': {'isFirst': False}},
 'internal': {'data': {'documentVersion': '123.0', 'id': '12345678'}},
 'request': [{'count': 123,
              'durationMetric': {'count': 123.0,
                                 'max': 12345.0,
                                 'min': 12345.0,
                                 'sampledValue': 12345.0,
                                 'stdDev': 0.0,
                                 'value': 12345.0},
              'id': '12345678',
              'name': 'GET navigation/Index',
              'responseCode': 123,
              'success': True,
              'url': 'http://server1.test.com/12345678',
              'urlData': {'base': '/navigation/123456',
                          'hashTag': '',
                          'host': 'server1.test.com',
                          'protocol': 'http'}}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...