Нужна помощь в удалении строк None из объекта dask для нескольких больших файлов json

Привет, я пытаюсь сгладить и проанализировать только 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': 'набрано', 'экран': 'КАМЕРА'}, Никто, Нет)введите описание изображения здесь

Привет zim68, добро пожаловать в ТАК. Не могли бы вы привести пример после этого документа Макви?

rpanai 28.05.2019 00:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
404
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Я бы использовал метод filter:

b2 = b.map(flatten).filter(bool)

(или, чтобы быть более точным, замените bool на lambda x: x is not None; это функция, которая указывает, хотите ли вы сохранить данный элемент или нет)

Затем вы можете записать это в файлы или превратить в фрейм данных и выполнять над ним дальнейшие операции.

Другие вопросы по теме