Python 需要帮助从多个大型json文件的dask对象中删除None行吗

Python 需要帮助从多个大型json文件的dask对象中删除None行吗,python,json,pandas,data-analysis,dask,Python,Json,Pandas,Data Analysis,Dask,嗨,我正在尝试扁平化和解析许多键中的7个:来自30个嵌套的大型.json.gz文件的值对(解压前每个文件4GB)。我正在尝试使用标准的pandas和json组合,但每次读取30个大型json文件中的一行似乎不是最好的主意,因此经过一些搜索,我找到了dask,这使得速度非常快。我正在使用这个函数,我能够为每个json对象平展并快速显示我关心的7个字段 目标是获取具有key:screen和value:CAMERA的所有json对象。问题是这些文件中的json对象并非都有key=screen。为了覆

嗨,我正在尝试扁平化和解析许多键中的7个:来自30个嵌套的大型.json.gz文件的值对(解压前每个文件4GB)。我正在尝试使用标准的pandas和json组合,但每次读取30个大型json文件中的一行似乎不是最好的主意,因此经过一些搜索,我找到了dask,这使得速度非常快。我正在使用这个函数,我能够为每个json对象平展并快速显示我关心的7个字段

目标是获取具有
key:screen
value:CAMERA
的所有json对象。问题是这些文件中的json对象并非都有
key=screen
。为了覆盖没有
key=screen
的行的键错误,我做了一些我知道不推荐的事情;试着抓住拦网。虽然这样做有效,但它只会创建一堆
None
行,无法快速删除它们。为了更清楚,在没有任何可展平的地方创建了
None
行,因为特定的json对象没有
screen
键。我想找到 a)一种基于键而不仅仅是值过滤和展平json文件的方法。 或 *b) *为dask行李找到一个swift
dropna()
等价物,这样我就可以在一个命令中清除所有这些
None

最终目标是对2018年3月的所有文件执行此操作,并将其编译为一个数据框架以供进一步分析

我尝试过使用其他不涉及使用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)
(无, 没有一个 {'userId':'foo', '表达式':'条形', “平台”:“IOS”, “国家”:“GT”, “日期”:“2018-03-04T22:58:18.000Z”, 'cameraImageType':'typed', “屏幕”:“摄像头”}, 没有一个
无)

如果我理解正确,您的包中包含一些元素,其中包含字典中的真实数据,而一些元素仅包含值
,其中无法找到密钥-您希望只保留真实数据

我将使用以下方法:

(或者,更明确地说,将
bool
替换为
lambda x:x不是None
;这是一个指定是否保留给定元素的函数)


然后,您可以将其写入文件,或者将其转换为数据帧并对其执行进一步的操作。

如果我理解正确,您的包中包含一些元素,其中包含字典形式的真实数据,还有一些元素仅包含值
None
,其中找不到键-您希望只保留真实数据

我将使用以下方法:

(或者,更明确地说,将
bool
替换为
lambda x:x不是None
;这是一个指定是否保留给定元素的函数)


然后您可以将其写入文件,或转换为数据帧并对其执行进一步的操作。

Hi zim68,欢迎使用SO。你介意提供一个遵循此文档的示例吗?嗨,zim68,欢迎来到SO。您是否介意在本文档之后提供一个示例?
b2 = b.map(flatten).filter(bool)