我有一个类似于以下的rdd:
s = sc.parallelize([(901943132160, {'P1': 0.0, 'cust_id': 'C5'}), (901943132160, {'P2': 0.125, 'cust_id': 'C5'}), (901943132160, {'cust_id': 'C5', 'P3': 0.875}), (901943132160, {'P4': 0.0, 'cust_id': 'C5'}), (901943132160, {'P5': 0.0, 'cust_id': 'C5'}), (901943132160, {'P8': 0.0, 'cust_id': 'C5'}), (901943132160, {'cust_id': 'C5', 'P9': 0.875}), (1357209665536, {'P1': 0.0, 'cust_id': 'C2'}), (1357209665536, {'P2': 0.0, 'cust_id': 'C2'}), (1357209665536, {'cust_id': 'C2', 'P3': 1.0}), (1357209665536, {'P4': 0.0, 'cust_id': 'C2'}), (1357209665536, {'P5': 0.0, 'cust_id': 'C2'}), (1357209665536, {'P8': 0.0, 'cust_id': 'C2'}), (1357209665536, {'cust_id': 'C2', 'P9': 0.75}), (489626271744, {'P1': 0.0, 'cust_id': 'C4'}), (489626271744, {'P2': 0.0, 'cust_id': 'C4'}), (489626271744, {'cust_id': 'C4', 'P3': 0.5}), (489626271744, {'P4': 0.5, 'cust_id': 'C4'}), (489626271744, {'P5': 0.0, 'cust_id': 'C4'}), (489626271744, {'P8': 0.125, 'cust_id': 'C4'}), (489626271744, {'cust_id': 'C4', 'P9': 0.375}), (463856467968, {'P1': 0.08333333333333333, 'cust_id': 'C3'}), (463856467968, {'P2': 0.3333333333333333, 'cust_id': 'C3'}), (463856467968, {'cust_id': 'C3', 'P3': 0.3333333333333333}), (463856467968, {'P4': 0.08333333333333333, 'cust_id': 'C3'}), (463856467968, {'P5': 0.08333333333333333, 'cust_id': 'C3'}), (463856467968, {'P8': 0.3333333333333333, 'cust_id': 'C3'}), (463856467968, {'cust_id': 'C3', 'P9': 0.3333333333333333}), (1305670057984, {'P1': 0.5, 'cust_id': 'C1'}), (1305670057984, {'P2': 0.375, 'cust_id': 'C1'}), (1305670057984, {'cust_id': 'C1', 'P3': 0.0}), (1305670057984, {'P4': 0.0, 'cust_id': 'C1'}), (1305670057984, {'P5': 0.6875, 'cust_id': 'C1'}), (1305670057984, {'P8': 0.0625, 'cust_id': 'C1'}), (1305670057984, {'cust_id': 'C1', 'P9': 0.0625})])
我想编写一个reduceByKey操作,我期待类似于以下内容:
[('C3', {'P8': 0.3333333333333333, 'P1': 0.08333333333333333, 'P9': 0.3333333333333333, 'P2': 0.3333333333333333, 'P3': 0.3333333333333333}), ('C4', {'P9': 0.375, 'P3': 0.5, 'P4': 0.5}), ('C5', {'P9': 0.875, 'P2': 0.125, 'P3': 0.875}), ('C1', {'P1': 0.5,'P2': 0.375,'P5': 0.6875}), ('C2', {'P9': 0.75, 'P3': 1.0, 'P5': 0.0})]
我想要做的是,对于每个产品,我会检查分数,并且只返回具有最佳三分产品的分数。计划通过reduceByKey执行此操作
答案 0 :(得分:1)
您可以通过执行以下操作来实现您的要求
def dictionaryFunc(x):
d = {}
for i in range(0, len(x), 2):
d[x[i]] = x[i+1]
return d
from operator import add
s.map(lambda x: (x[1]['cust_id'], sorted(x[1].items())[0])).reduceByKey(add).map(lambda x: [x[0], dictionaryFunc(x[1])])
其中
x[1]['cust_id']
取每个词典的cust_id
键值
sorted(x[1].items())[0]
是排序字典的第一个元素
reduceByKey(add)
正在添加分组元组的第二个元素
dictionaryFunc(x[1])]
根据您的要求正在形成词典