Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python并行处理庞大JSON的最佳方法_Python_Json_Apache Spark_Pyspark_Bigdata - Fatal编程技术网

使用Python并行处理庞大JSON的最佳方法

使用Python并行处理庞大JSON的最佳方法,python,json,apache-spark,pyspark,bigdata,Python,Json,Apache Spark,Pyspark,Bigdata,我有一个大约5GB大小的巨大JSON和200万条记录。我正试图根据一个条件合并一些记录。在下面的示例中,我尝试为每个部分创建一条记录,并将所有学生信息添加为嵌套的json。我还想拆分subject字段并将其转换为数组。还有更多这样的行动 原始json: [{“部分”:“abc”,“学生id”:“ss-23235”,“科目”:“物理;数学;化学”}, {“部分”:“abc”,“学生id”:“ss-33237”,“科目”:“物理;数学;化学”}, {“部分”:“xyz xyz xyz”,“学生id”

我有一个大约5GB大小的巨大JSON和200万条记录。我正试图根据一个条件合并一些记录。在下面的示例中,我尝试为每个部分创建一条记录,并将所有学生信息添加为嵌套的json。我还想拆分
subject
字段并将其转换为数组。还有更多这样的行动

原始json:

[{“部分”:“abc”,“学生id”:“ss-23235”,“科目”:“物理;数学;化学”},
{“部分”:“abc”,“学生id”:“ss-33237”,“科目”:“物理;数学;化学”},
{“部分”:“xyz xyz xyz”,“学生id”:“ss-13632”,“科目”:“物理;数学;化学”},
{“部分”:“xyz xyz xyz”,“学生id”:“ss-13265”,“科目”:“物理;数学;化学”}]
我想把它转换成下面的形式

[
{
“部分”:“abc”,
“学生”:[
{
“学生id”:“ss-23235”,
“主题”:[
“物理学”,
“数学”,
“化学”
]
},
{
“学生id”:“ss-33237”,
“主题”:[
“物理学”,
“数学”,
“化学”
]
}
]
},
{
“节”:“xyz xyz xyz”,
“学生”:[
{
“学生id”:“ss-13632”,
“主题”:[
“物理学”,
“数学”,
“化学”
]
},
{
“学生id”:“ss-13265”,
“主题”:[
“物理学”,
“数学”,
“化学”
]
}
]
}
]
我尝试在spark中加载数据,并在列表中使用唯一会话,然后使用Python
multiprocessing.pool
开始处理,如下所示

从multiprocessing.pool导入线程池
池=线程池(8)
def流程(第部分,学生df):
#处理部件并存储在列表中
已处理的_数据_列表=[]
对于第\u部分中的第\u节id:
students=student\u df.filter(student\u df.section==section\u id)
更新的_info=students.first().asDict()
嵌套的搜索列表=[]
对于学生中的学生。收集()[1:]:
ind_info=student.asDict()
#处理每个记录并将数据存储在ind_info中
#工业信息[“学科]:[“物理”、“数学”、“化学”]
嵌套列表。追加(索引信息)
更新的学生信息[“学生”]=嵌套的学生列表
已处理的\u数据\u列表。追加(更新的\u信息)
返回已处理的\u数据\u列表
uniq_section_list=student_df.select(“section”).distinct().collect()
#创建包含10000个节的列表列表
截面零件=[uniq\U截面列表[i:i+10000]表示范围内的i(0,len(uniq\U截面列表),10000)]
#使用lambda处理每个子列表
结果列表=pool.map(lambda部分:过程(部分),部分)
#将所有结果列表合并到一个更大的列表中
final_datalist=list(itertools.chain.from_iterable(result_list))
#另存为新json文件
以open('result.json','w')作为fout:
json.dump(最终数据列表,fout)
我在
16gbram
8核CPU
上运行这个。
对于
200000
记录的样本,需要12个多小时。以更快的方式实现这一目标的最佳方式是什么?我可以使用任何库。

您可以使用Spark来处理和聚合JSON:

import pyspark.sql.functions as F

result = df.groupBy('section').agg(
    F.collect_list(
        F.struct(
            'student_id', 
            F.split('subjects', ';').alias('subjects')
        )
    ).alias('students')
)

result.show(truncate=False)
+-----------+----------------------------------------------------------------------------------+
|section    |students                                                                          |
+-----------+----------------------------------------------------------------------------------+
|xyz-xyz-xyz|[[ss-13632, [physics, maths, chemistry]], [ss-13265, [physics, maths, chemistry]]]|
|abc-abc-abc|[[ss-23235, [physics, maths, chemistry]], [ss-33237, [physics, maths, chemistry]]]|
+-----------+----------------------------------------------------------------------------------+

result.coalesce(1).write.json('result')

您可以使用Spark处理和聚合JSON:

import pyspark.sql.functions as F

result = df.groupBy('section').agg(
    F.collect_list(
        F.struct(
            'student_id', 
            F.split('subjects', ';').alias('subjects')
        )
    ).alias('students')
)

result.show(truncate=False)
+-----------+----------------------------------------------------------------------------------+
|section    |students                                                                          |
+-----------+----------------------------------------------------------------------------------+
|xyz-xyz-xyz|[[ss-13632, [physics, maths, chemistry]], [ss-13265, [physics, maths, chemistry]]]|
|abc-abc-abc|[[ss-23235, [physics, maths, chemistry]], [ss-33237, [physics, maths, chemistry]]]|
+-----------+----------------------------------------------------------------------------------+

result.coalesce(1).write.json('result')