[英]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.