繁体   English   中英

Dataframe pyspark 在 groupby 操作后到字典

[英]Dataframe pyspark to dictionary after groupby operations

我希望在pyspark中解决以下问题。

我有一个庞大的数据集,我想在其上计算必须存储在字典中的基本统计数据。

下表大致描述了数据集,尽管实际上它要大得多。

我感兴趣的目标数据的数据类型是字符串或双精度。

|  key1  | ... | key2   | key3   | value1 | ... | value2 | 
|--------|-----|--------|--------|--------|-----|--------| 
| string | ... | string | string | double | ... | double | 

我必须在 [key1, key2, key3] 上执行 groupBy 并计算 value1 和 value2 的平均值和标准差。

然后,我想将所有结果存储在具有以下结构的字典中:

dict {[key1, key2, key3]  :  [avg1, sd1, avg2, sd2]}

我最初的方法是先执行计算,例如:

sparkdf.groupBy(keys).agg(avg(v1), stddev(v1), avg(v2), stddev(v2)) 

然后将生成的 sparkdf 转换为 pandasdf 并遍历行以构建字典。 但对于大型数据集,我高度怀疑这种方法是否合理。

我了解到这样做的一种方法是使用地图和 UDF。

例如:

sparkdf.groupBy(keys)
       .agg(collect_list(create_map([avg1, sd1, avg2, sd2]).alias('map')))

map = udf(lambda maps: {key:r[key] for r in map for key in r}, 
                 MapType( StringType(), DoubleType())

dict = do something with the map

这种解决方案是本主题中讨论的内容( Dataframe pyspark 到 dict )。

但是,在我的情况下,我没有需要使用 groupBy 操作计算的值 [avg1, sd1, avg2, sd2]。 由于使用了诸如 collect_list 和 create_map 之类的方法,因此我不能将 avg(v1) 放入其中,否则将返回错误。

有人可以建议您如何构建我需要的字典吗?

非常感谢!

假设您的 output 字典足够小以适合您的主节点 memory,并假设keys是键字段名称的列表,这应该可以工作(尽管我没有运行它,所以可能有错别字):

aggregatedSparkDf = sparkdf.groupBy(keys).agg(avg(v1), stddev(v1), avg(v2), stddev(v2))
aggregatedPandasDf = aggregatedSparkDf.toPandas().set_index(keys)
aggregatedPandasSeriesOfLists = aggregatedPandasDf.apply(list, result_type='reduce', axis=1)
aggregatedDict = aggregatedPandasSeriesOfLists.to_dict()

这应该会给你一个 dict {(key1,key2,key3}:[avg1,std1,avg2,std2])。

但是你为什么要转换成字典呢? 很可能您最好使用 pandas DF。

暂无
暂无

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

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