2017-05-01 11 views
0

(グループ化された)pysparkデータフレーム内のマップの列を1つのマップに集約するcollect_listまたはcollect_setと同様の機能はありますか?たとえば、この関数は次のように動作している場合があります。pysparkデータフレーム内のマップの配列を1つのマップに結合

>>>df.show() 

+--+---------------------------------+ 
|id|        map | 
+--+---------------------------------+ 
| 1|     Map(k1 -> v1)| 
| 1|     Map(k2 -> v2)| 
| 1|     Map(k3 -> v3)| 
| 2|     Map(k5 -> v5)| 
| 3|     Map(k6 -> v6)| 
| 3|     Map(k7 -> v7)| 
+--+---------------------------------+ 

>>>df.groupBy('id').agg(collect_map('map')).show() 

+--+----------------------------------+ 
|id|     collect_map(map) | 
+--+----------------------------------+ 
| 1| Map(k1 -> v1, k2 -> v2, k3 -> v3)| 
| 2|      Map(k5 -> v5)| 
| 3|   Map(k6 -> v6, k7 -> v7)| 
+--+----------------------------------+ 

おそらく他のcollect_の集計とUDFのいずれかを使用して所望の結果を得るには余りにも難しいことではないだろうが、それはこのようなもののように思えるはずすでに存在しています。

答えて

1

他のユーザーが回答する前に自分の質問に回答するのはおそらく貧弱な形ですが、誰かがudfベースのバージョンを探している場合は、これが可能な回答の1つです。

from pyspark.sql.functions import udf,collect_list 
from pyspark.sql.types import MapType,StringType 

combineMap=udf(lambda maps: {key:f[key] for f in maps for key in f}, 
       MapType(StringType(),StringType())) 

df.groupBy('id')\ 
    .agg(collect_list('map')\ 
    .alias('maps'))\ 
    .select('id',combineMap('maps').alias('combined_map')).show() 
関連する問題