将元组元素减去其他元组--Pyspark

时间:2018-03-09 07:56:53

标签: python apache-spark pyspark

我是使用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]是为了让我的物品数量。

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

我希望答案很有帮助