![](/img/trans.png)
[英]How to generate a table with one row for each count of distinct possibilities from one column, including null?
[英]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.