我的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 但无法成功执行代码的项目。谁能帮我解决这个问题?
答案 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))