簡體   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