Python 需要帮助从多个大型json文件的dask对象中删除None行吗
嗨,我正在尝试扁平化和解析许多键中的7个:来自30个嵌套的大型.json.gz文件的值对(解压前每个文件4GB)。我正在尝试使用标准的pandas和json组合,但每次读取30个大型json文件中的一行似乎不是最好的主意,因此经过一些搜索,我找到了dask,这使得速度非常快。我正在使用这个函数,我能够为每个json对象平展并快速显示我关心的7个字段 目标是获取具有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。为了覆
key:screen
和value:CAMERA
的所有json对象。问题是这些文件中的json对象并非都有key=screen
。为了覆盖没有key=screen
的行的键错误,我做了一些我知道不推荐的事情;试着抓住拦网。虽然这样做有效,但它只会创建一堆None
行,无法快速删除它们。为了更清楚,在没有任何可展平的地方创建了None
行,因为特定的json对象没有screen
键。我想找到
a)一种基于键而不仅仅是值过滤和展平json文件的方法。
或
*b) *为dask行李找到一个swiftdropna()
等价物,这样我就可以在一个命令中清除所有这些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)