2015-06-19 8 views
0

В настоящее время у меня есть RDD с массивом, в котором хранится пара значений ключа, где ключ является двумерными индексами массива, а значение - это число в этом месте. Например, [((0,0), 1), ((0,1), 2), ((1,0), 3), ((1,1), 4)] Я хочу добавить значения каждого ключа с окружающими значениями. Что касается моего предыдущего примера, я хочу добавить 1,2,3 и поместить его в пятно ключевого значения (0,0). Как мне это сделать?Pyspark Array Key, Value

+1

Я не могу понять, что вы хотите. Обычно в python вы должны использовать карту для любой пары «ключ-значение», почему вы используете массивы, где трудно определить точное значение хранимых tupples. – WorldSEnder

+1

Можете ли вы сделать это яснее? Если вы напишете результат, который вы хотите получить из данного массива, и объясните, что я могу помочь. – Chintan

ответ

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. Используйте 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) 
    

Я надеюсь, что это имеет смысл.

Смежные вопросы