我是Spark的新手,我仍然试图围绕它的一些概念。 所以,我有一个键值元组列表,其中键和值都是元组。
val = [
((18, 13), (1, 1193, **5, 1**)),
((18, 13), (1, 661, **3, 1**)),
((9, 15), (1, 914, **3, 1**))
]
在值元组中,我对最后两个元素感兴趣(以粗体显示)。
我希望执行以下操作:5 + 3和1 + 1,因为它们的元组共享一个公共密钥(18,13),而最后一个元组,值3和1应该保持不变。 为此,我将执行以下操作:
parsed_data = sc.parallelize(val)
result = parsed_data.reduceByKey(lambda x,y: (x[2]+y[2], x[3]+y[3]))
应用这些reduceByKey后,我得到了以下结果:
[((18, 13), (8, 2)), ((9, 15), (1, 914, 3, 1))]
reduceByKey函数未应用于最后一个元组,因为它没有要减少的对。现在我试图了解如何应用reducebyKey,以获得以下输出:
[((18, 13), (8, 2)), ((9, 15), (3, 1))]
答案 0 :(得分:3)
这里最简单的可能只是预先映射值:
parsed_data.mapValues(lambda x: (x[2], x[3])).reduceByKey(lambda x,y: (x[0]+y[0], x[1]+y[1]))
(道歉,如果语法错误,我是Scala人而不是Python人。)