我目前有一个带有数组的RDD,该数组存储键值对,其中键是数组的2D索引,值是该点的数字。例如[((0,0),1),((0,1),2),((1,0),3),((1,1),4)] 我想将每个键的值与周围值相加。关于我之前的例子,我想将1,2,3加起来并将其放在(0,0)键值位置。我该怎么做?
答案 0 :(得分:0)
我建议你做以下事情:
定义一个函数,给定一对(i,j),返回一个列表,其中的对应对应于(i,j)周围的位置,加上输入对(i,j)。例如,假设该函数被称为surrounding_pairs(pair)
。然后:
surrounding_pairs((0,0)) = [ (0,0), (0,1), (1,0) ]
surrounding_pairs((2,3)) = [ (2,3), (2,2), (2,4), (1,3), (3,3) ]
当然,你需要小心并只返回有效的职位。
在您的RDD上使用flatMap
,如下所示:
MyRDD = MyRDD.flatMap(lambda (pos, v): [(p, v) for p in surrounding_pairs(pos)])
这将映射您的RDD
[((0,0),1),((0,1),2),((1,0),3),((1,1),4)]
到
[((0,0),1),((0,1),1),((1,0),1),
((0,1),2),((0,0),2),((1,1),2),
((1,0),3),((0,0),3),((1,1),3),
((1,1),4),((1,0),4),((0,1),4)]
这样,每个位置的值将被“复制”到邻居位置。
最后,只需使用reduceByKey
在每个位置添加相应的值:
from operator import add
MyRDD = MyRDD.reduceByKey(add)
我希望这是有道理的。