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