Python Spark reduceByKey不适用于单个元素

时间:2017-01-06 10:25:33

标签: python python-2.7 apache-spark mapreduce pyspark

我是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))]

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人。)