在RDD中过滤具有公共密钥的(key:value)对的代码

时间:2019-05-28 10:46:38

标签: scala apache-spark rdd

我的RDD如下:

[(((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中筛选出另一个RDD,该RDD仅包含具有公共键的那些Key:value对。那就是我的输出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})

我认为下一步是迭代该词典,以便我可以过滤出 values> 1 但无法成功执行代码的项目。谁能帮我解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可以使用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))