我是使用spark和python的新手
我有以下元组
#Money in each account
[(key), {(4.32,32.32,23.3),(3.23,32.2,21.3)}]
我要做的是从每个元素中减去例如(4.32,32.32,23.3)每个帐户对应的平均值,到4.32 - 3.23,到32.32 - 32.32 ......
我的想法是做到以下几点。
subtract = myRDD.reduceByKey(lambda x,y: ((x[0][0]-y[1][0]), (x[0][1]-y[1][1]), (x[0][2]-y[1][2])))
但我不知道如何正确输入索引。
我的输入文件具有以下结构。
Index,Person,Account1,Account2,Account3
0,Serge,5.958191,0.6880646,8.135345
然后我计算每一行的平均值,例如对所有名为Serge的键,我有以下数据元组。
{('Serge'),((5.958191,0.6880646,8.135345),(3.23,32.2,21.3))}
现在我想要的是减去每个元素的平均值......
所以例如在这种情况下,我想要一个具有以下结构的元组。
{('Serge'),((5.958191-3.23,0.6880646-32.2,8.135345-21.3, 10))}
我的代码;
data = sc.textFile("myFile.csv")
data1 = data.map(lambda x: ((x.split(",")[1]),(x.split(",")[2],x.split(",")[3],x.split(",")[4]))
mean = data.mapValues( lambda x: (x,1) ) \
.reduceByKey (lambda x , y: ((x[0][0] + y[0][0], x[0][1] + y[0][1], x[0][2] + y[0][2]), x[1] + y[1])).mapValues (lambda a: (a[0][0]/a[1],a[0][1]/a[1],a[0][2]/a[1], a[1]))
data2 = mean.join(data1)
来自mapValues的最后一个[1]是为了让我的物品数量。
答案 0 :(得分:0)
如果你有表示rdd ,你可以在reduceByKey
之后找到
(u'Serge', (-5.962059049999999, 0.6719970749999999, 8.15111525))
阅读新文件后得到的和 data1 rdd
(u'Serge', (3.23, 32.2, 21.3))
和你join
他们
data2 = mean.join(data1)
所以你有
(u'Serge', ((-5.962059049999999, 0.6719970749999999, 8.15111525), (3.23, 32.2, 21.3)))
现在我想要的是减去每个元素的含义...
例如,在这种情况下,我想要一个具有以下结构的元组 {(' Serge'),((5.958191-3.23,0.6880646-32.2,8.135345-21.3,10))}
我不知道10
来自哪里,但要减去你可以简单地使用地图功能
data2.map(lambda x: ((x[0]), (x[1][0][0] - x[1][1][0], x[1][0][1] - x[1][1][1], x[1][0][2] - x[1][1][2])))
所以最终结果将是
('Serge', (-9.19205905, -31.528002925000003, -13.14888475))
我希望答案很有帮助