繁体   English   中英

如何从 PySpark 中一个 DataFrame 的每一行生成,然后减少一组大量的 DataFrame?

[英]How to generate, then reduce, a massive set of DataFrames from each row of one DataFrame in PySpark?

不幸的是,我无法分享我的实际代码或数据,因为它是专有的,但是如果读者从文本中不清楚问题,我可以生成 MWE。

我正在处理一个包含约 5000 万行的数据框,每行都包含一个大型 XML 文档。 从每个 XML 文档中,我提取了与标签之间的出现次数和层次关系相关的统计信息列表(与未记录的 XML 格式不同,这让人们眼前一亮)。 我可以在数据帧中表达这些统计数据,并且可以使用 GROUP BY/SUM 和 DISTINCT 等标准操作将这些数据帧合并到多个文档中。 目标是提取所有 5000 万个文档的统计信息,并将它们表达在单个数据框中。

问题是我不知道如何从 Spark 中一个数据帧的每一行有效地生成 5000 万个数据帧,或者如何告诉 Spark 使用二元运算符将 5000 万个数据帧的列表减少到一个数据帧。 有做这些事情的标准函数吗?

到目前为止,我发现的唯一解决方法是非常低效(将数据存储为字符串,解析它,进行计算,然后将其转换回字符串)。 使用此方法需要数周才能完成,因此不切实际。

从每一行的每个 XML 响应中提取的数据和统计数据可以存储在行本身的附加列中。 这样,spark 应该能够在其多个执行程序中执行流程以提高性能。 这是一个伪代码。

from pyspark.sql.types import StructType, StructField, IntegerType, 
StringType, DateType, FloatType, ArrayType

def extract_mobile_metrics_from_json(row):
    j = row['xmlResponse'] # assuming your xml column name is xmlResponse
    # perform your xml extractions and computations for the xmlResponse in python
    ...
    load_date = ...
    stats_data1 = ...
    
    return Row(load_date, stats_data1, stats_data2, stats_group)

  
schema = schema = StructType([StructField('load_date', DateType()),
                     StructField('stats_data1', FloatType()),
                     StructField('stats_data2', ArrayType(IntegerType())),
                     StructField('stats_group', StringType())
                     ])
df_with_xml_stats = original_df.rdd\
                            .map(extract_metrics_from_xml)\
                            .toDF(schema=schema, sampleRatio=1)\
                            .cache()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM