Sum元组值计算平均值 - RDD

时间:2018-03-06 22:43:21

标签: apache-spark pyspark rdd

我有以下元组。

#                                 x           y        z
[(('a', 'nexus4', 'stand'), ((-5.958191, 0.6880646, 8.135345), 1))]
#           part A (key)               part B (value)         count

正如你所看到的,我有一个元组,这是我的密钥(A部分),我有另一个元组,这是我的价值(B部分)和我的关键部分不同价值的数字。

我这样做的代码如下:

# Cargo los datos
lectura = sc.textFile("asdasd.csv")

datos = lectura.map(lambda x: ((x.split(",")[6], x.split(",")[7], x.split(",")[9]),(float(x.split(",")[3]),float(x.split(",")[4]), float(x.split(",")[5])))) 

meanRDD = (datos.mapValues(lambda x: (x, 1)))

好的,现在我想要求所有具有相同KEY的值,以从X列,Y列或Z列计算MEAN。

我想我可以通过使用reduceByKey来实现,但我没有正确应用此功能。

我的代码无效的示例:

sum = meanRDD.reduceByKey(lambda x, y: (x[0][0] + y[0][1],x[0][1] + y[1][1], x[0][2] + y[1][2]))

我知道之后我必须应用另一个MapValues函数来将我的值除以我的计数部分,但总和不能正常工作。

示例" asdasd.csv"文件

 Index,Arrival_Time,Creation_Time,x,y,z,User,Model,Device,gt
0,1424696633908,1424696631913248572,-5.958191,0.6880646,8.135345,a,nexus4,nexus4_1,stand
1,1424696633909,1424696631918283972,-5.95224,0.6702118,8.136536,a,nexus4,nexus4_1,stand
2,1424696633918,1424696631923288855,-5.9950867,0.6535491999999999,8.204376,a,nexus4,nexus4_1,stand
3,1424696633919,1424696631928385290,-5.9427185,0.6761626999999999,8.128204,a,nexus4,nexus4_1,stand

我的密钥是元组(模型,设备,gt)我的值是(x,y,z)

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

以下是使用reduceByKey

的完整解决方案
lectura = sc.textFile("asdasd.csv")

datos = lectura.map(lambda x: ((x.split(",")[6], x.split(",")[7], x.split(",")[9]),(float(x.split(",")[3]),float(x.split(",")[4]), float(x.split(",")[5]))))

meanRDD = datos.mapValues(lambda x: (x, 1))\
               .reduceByKey(lambda ((x1, y1, z1), a1), ((x2, y2, z2), a2): ((x1+x2, y1+y2, z1+z2), a1+a2))\
               .mapValues(lambda ((x, y, z), sum): (x/float(sum), y/float(sum), z/float(sum)))