我有一个对象列表定义为:
class AD:
def __init__(self, name=None, impressions=0):
self.name = name
self.impressions= impressions
现在,有没有办法使用 map Reduce 方法来获取按名称分组的更新 AD 列表,并汇总展示次数。例如:
adList = []
ad1 = AD("BlackFriday",29)
ad2 = AD("BlackFriday",33)
ad3 = AD("CyberMonday",35)
adList .append(a1)
adList .append(a2)
adList .append(a3)
我知道我不必使用地图减少功能来获得结果。如果我使用mapreduce,我如何得到以下结果:
newList[0].name = "BlackFriday"
newList[0].impressions = 62
newList[1].name = "CyberMonday"
newList[1].impressions = 35
感谢您的帮助。
以下代码未经测试,因为我没有任何可用的环境
您的意见:
ad1 = AD("BlackFriday",29)
ad2 = AD("BlackFriday",33)
ad3 = AD("CyberMonday",35)
为了能够使用 map
+ reduce
,您需要一些 RDD(为此,您可以使用 parallelize
)
rdd = sc.parallelize(list((ad1, ad2, ad3)))
然后,您将 rdds map
为(name, impressions)
元组,以便您可以按键减少 after
rddReduced = rdd.map(lambda a: (a.name, a.impressions)).reduceByKey(lambda x,y : x + y)
然后map
返回到 AD 对象并调用 collect
以列表形式获取结果
adList = rddReduced.map(lambda (n,i): AD(n,i)).collect()