Pyspark 从rdd中选择元素,其中(x,y)、(y,x)在rdd中存在
我有以下rddPyspark 从rdd中选择元素,其中(x,y)、(y,x)在rdd中存在,pyspark,rdd,Pyspark,Rdd,我有以下rdd [('K', ' M'), ('K', ' H'), ('M', ' K'), ('M', ' E'), ('H', ' F'), ('B', ' T'), ('B', ' H'), ('E', ' K'), ('E', ' H'), ('F', ' K'), ('F', ' H'), ('F', ' E'), ('A', ' Z')] 我想过滤掉rdd中存在(y,x)的元素(x,y)。在我的示例中,输出应该如下所示: [(K,M), (H,F)]
[('K', ' M'),
('K', ' H'),
('M', ' K'),
('M', ' E'),
('H', ' F'),
('B', ' T'),
('B', ' H'),
('E', ' K'),
('E', ' H'),
('F', ' K'),
('F', ' H'),
('F', ' E'),
('A', ' Z')]
我想过滤掉rdd中存在(y,x)的元素(x,y)。在我的示例中,输出应该如下所示:
[(K,M),
(H,F)]
感谢您的帮助您可以对每个元组进行排序,对元组进行计数,然后筛选出出现多次的元组:
rdd.groupBy(lambda t: (min(t), max(t)))
.mapValues(len)
.filter(lambda t: t[1] > 1)
.map(lambda t: t[0])
.collect()
# [('F', 'H'), ('K', 'M')]
为什么
('E','H')
不是预期输出的一部分?不,因为在输入RDD中没有('H','E')
,所以你的意思是你想保留(x,y)
,而(y,x)
不存在?我想输出(x,y)
,因为(y,x)
存在。例如,(K,M)
和(M,K)
存在。类似地,对于(H,F)
,存在(F,H)
。这不会给我所需的输出。输出rdd是一个空rdd,即每个元组中的第二个元素都有一个空格前缀。这是故意的吗?我假设你已经清理过了。这是什么mapValues(len)
在这里做什么。如果我做rdd.groupBy(lambda t:(min(t),max(t)).mapValues(len).collect()
输出是[(('M','K'),1),('H','K'),1),('K','M'),1),('F','H'),1),('t','B'),1),('H','B'),1),('K','E','E'),1),('K','F','F'),1),('H','F','A','E','E',',1)]
。mapValues(len)
的输出为1,它计算每组的长度。o很抱歉,您是对的。我不清楚。谢谢