Привет, я пытаюсь сгладить и проанализировать только 7 из многих пар ключ: значение из 30 вложенных больших файлов .json.gz (по 4 ГБ каждый перед распаковкой). Я пытаюсь сделать стандартную комбинацию pandas и json, но чтение строк по одной строке за раз для 30 больших файлов json не кажется лучшей идеей, поэтому после некоторого поиска я нашел dask, который сделал это очень быстро. Я использую эту функцию, мне удалось быстро сгладить 7 полей, которые мне нужны для каждого объекта json.
изображение кода ноутбука Jupyter и вместе с результатом
Цель состоит в том, чтобы захватить все объекты json, у которых есть key:screen
и value:CAMERA
. Проблема в том, что не все объекты json в этих файлах имеют key=screen
. Чтобы переопределить эту ключевую ошибку для строк, где нет key=screen
, я делаю то, что, как я знаю, не рекомендуется; попробуй поймай блок. Хотя это работает, оно просто создает кучу None
строк, и их невозможно быстро удалить. Для большей ясности строки None
создаются в местах, где нечего было сглаживать, потому что у этого конкретного json-объекта не было ключа screen
. я хочу найти
либо а) способ отфильтровать и сгладить файлы json на основе ключа, а не только значения.
ИЛИ
*b)*Найти быстрый dropna()
эквивалент для пакетов dask, чтобы я мог избавиться от всех этих None
строк одной командой.
Конечная цель — сделать это для всех файлов за март 2018 года и скомпилировать их в один фрейм данных для дальнейшего анализа.
Я пытался использовать другие команды и методы, которые не включают использование dask, например модуль ijson
и весь префикс, значение (проверьте закомментированную часть следующего снимка экрана). Ни один из вариантов не кажется таким быстрым и эффективным, как метод dask.bag
, учитывая размер моих файлов. Идеальным решением было бы найти способ избавиться от проблем с None
строками.
import dask.bag as db
import json
import gzip
import pandas as pd
import ijson as ij
path = "etl/mar2018/mongo-feedback-2018-03-05.json.gz"
# pd.read_json(path)
# b=ij.parse(path)
# print(b)
# def parse_json(json_filename):
# with gzip.open(path,'rt', encoding='utf-8') as input_file:
# # with open(json_filename, 'rb')
# # load json iteratively
# parser = ijson.parse(input_file)
# # return ij.items(parser)
# for prefix, event, value in parser:
# if prefix=='screen':
# print(value)
# # print(prefix)
# # print('prefix = {}, event = {}, value = {}'.format(prefix, event, value))
# # if __name__ == '__main__':
# parse_json(path)
# b.head()
b=db.read_text(path).map(json.loads)
# b.to_dataframe()
# b=b.filter(lambda record: record['screen'])
# # for i in b:
# # print(i)
# #
def flatten(record):
try:
return{
'userId': record['userId'],
'expression':record['expression'],
'platform':record['platform'],
'country':record['country'],
"date":record['date']['$date'],
"cameraImageType":record['metadataMap']["cameraImageType"],
"screen":record['screen']
}
except KeyError:
pass
df=b.map(flatten)
df.take(5)
# df.remove(None)
def filter1(record):
if record is None:
return record
# df.to_textfiles()
# .to_dataframe()
# p=df.map(filter1)
# df1=df-p
# # df.compute()
# # df.notnull().take(10)
# # df.dropna(how='all')
# # df.head(50)
# # p=filter(None,df)
# # list(b.filter('screen'))
# # b.count().compute()
# p=df.to_csv()
# d=df.dropna()
# d.head()
# # b.filter(lambda record: record['screen']=='CAMERA').take(10)
(Никто, Никто, {'Идентификатор пользователя': 'фу', «выражение»: «бар», «платформа»: «IOS», 'страна': 'GT', 'дата': '2018-03-04T22:58:18.000Z', 'cameraImageType': 'набрано', 'экран': 'КАМЕРА'}, Никто, Нет)введите описание изображения здесь
Если я правильно понимаю, в вашем мешке есть элементы с реальными данными в виде словарей, а некоторые просто со значением None
, где ключи найти не удалось - вы хотели бы оставить только настоящие данные.
Я бы использовал метод filter
:
b2 = b.map(flatten).filter(bool)
(или, чтобы быть более точным, замените bool
на lambda x: x is not None
; это функция, которая указывает, хотите ли вы сохранить данный элемент или нет)
Затем вы можете записать это в файлы или превратить в фрейм данных и выполнять над ним дальнейшие операции.
Привет zim68, добро пожаловать в ТАК. Не могли бы вы привести пример после этого документа Макви?