2017-09-20 7 views
0

にリスト内のキーと値のペアの値を合計するにはどうすればリスト、私は、各レコードのリスト内の各キーの値を追加する必要がはPySpark

rdd = [('12583', [('536370', 3.75), ('536370', 3.75), ('536370', 3.75)]), 
     ('17850', [('536365', 2.55), ('536365', 3.39), ('536365', 2.75)]), 
     ('13047', [('536367', 1.69), ('536367', 2.1), ('536368', 4.95), ('536368', 4.95), ('536369', 5.95)])] 

内キー値とRDDを持っています。私は腹を立てようとしましたが、mapValuesがリストにその追加を許可しないので、それは通りませんでした。

newRDD = rdd.groupByKey().map(lambda x : (x[0],list(x[1].mapValues(sum)))) 

私の期待どおりの結果あなたはcollections.defaultdictを使用して、リストの集計関数を定義することができるように怒鳴る

[('12583', ('536370', 11.25)), 
('17850', ('536365', 8.39)), 
('13047', ('536367', 3.79),('536368', 9.9), ('536368', 10.9))] 

答えて

2

です:

def agg_list(lst): 
    from collections import defaultdict 
    agg = defaultdict(lambda : 0) 
    for k, v in lst: 
     agg[k] += v 
    return list(agg.items()) 

をそしてrddの上にマッピングします。

rdd.map(lambda x: [x[0]] + agg_list(x[1])).collect() 
# [['12583', ('536370', 11.25)], 
# ['17850', ('536365', 8.69)], 
# ['13047', ('536367', 3.79), ('536369', 5.95), ('536368', 9.9)]]