код для фильтрации (ключ: значение) пары, имеющей общие ключи в СДР - PullRequest
1 голос
/ 28 мая 2019

У меня есть СДР следующим образом:

[(((1, 2), 1.0), (2, 3)),
 (((1, 2), 1.0), (3, 4)),
 (((1, 2), 3.0), (2, 5)),
 (((2, 3), 1.0), (1, 2)),
 (((2, 3), 1.0), (3, 4)),
 (((2, 3), 'inf'), (2, 5)),
 (((3, 4), 1.0), (1, 2)),
 (((3, 4), 1.0), (2, 3)),
 (((3, 4), -1.0), (2, 5)),
 (((2, 5), 3.0), (1, 2)),
 (((2, 5), 'inf'), (2, 3)),
 (((2, 5), -1.0), (3, 4))]  

Я хочу отфильтровать еще один СДР из этого СДР, который содержит только те пары ключ: значение, которые имеют общие ключи.То есть мой вывод RDD должен быть:

[(((1,2),1.0), (2,3)),  
 ((1,2),1.0), (3,4)),  
 ((2,3),1.0), (1,2)),  
 ((2,3),1.0), (3,4)),  
 ((3,4),1.0), (1,2)),  
 ((3,4),1.0), (2,3)))]

Я попробовал следующий код -
rdd.countByKey(), который вернул мне словарь, содержащий

defaultdict(int,
            {((1, 2), 1.0): 2,
             ((1, 2), 3.0): 1,
             ((2, 3), 1.0): 2,
             ((2, 3), 'inf'): 1,
             ((3, 4), 1.0): 2,
             ((3, 4), -1.0): 1,
             ((2, 5), 3.0): 1,
             ((2, 5), 'inf'): 1,
             ((2, 5), -1.0): 1})

Я думал об итерации по этомусловарь в качестве моего следующего шага, чтобы я мог отфильтровать те элементы, которые имеют значения> 1 , но не смогли выполнить код.Может кто-нибудь помочь мне с решением этой проблемы?

1 Ответ

0 голосов
/ 28 мая 2019

Вы можете использовать groupByKey, чтобы получить последовательность значений, а затем отфильтровать последовательности с менее чем двумя значениями

rdd.groupByKey().filter(lambda t: len(t[1]) >= 2).flatMapValues(lambda x: x).foreach(lambda x: print(x))

Выход:

(((1, 2), 1.0), (2, 3))
(((1, 2), 1.0), (3, 4))
(((2, 3), 1.0), (1, 2))
(((2, 3), 1.0), (3, 4))
(((3, 4), 1.0), (1, 2))
(((3, 4), 1.0), (2, 3))
...