Pyspark数组键,值

时间:2015-06-19 00:47:02

标签: multidimensional-array key-value pyspark

我目前有一个带有数组的RDD,该数组存储键值对,其中键是数组的2D索引,值是该点的数字。例如[((0,0),1),((0,1),2),((1,0),3),((1,1),4)] 我想将每个键的值与周围值相加。关于我之前的例子,我想将1,2,3加起来并将其放在(0,0)键值位置。我该怎么做?

1 个答案:

答案 0 :(得分:0)

我建议你做以下事情:

  1. 定义一个函数,给定一对(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) ]
    

    当然,你需要小心并只返回有效的职位。

  2. 在您的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)]
    

    这样,每个位置的值将被“复制”到邻居位置。

  3. 最后,只需使用reduceByKey在每个位置添加相应的值:

    from operator import add
    MyRDD = MyRDD.reduceByKey(add)
    
  4. 我希望这是有道理的。