我有以下元组。
# 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)
有什么想法吗?
答案 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)))