使用over-common列连接pyspark中的rdd

使用over-common列连接pyspark中的rdd,pyspark,rdd,self-join,Pyspark,Rdd,Self Join,我的RDD如下所示: myrdd=sc.parallelize([('a','b'),('a','c'),('b','c'),('c','d'))) 我想打印RDD中的行,其中行的第二个元素和任何其他行的第一个元素是公共的。所以,我想做自我连接 我想要的结果是: a,b,c,因为a,b和b,c都存在于我的RDD中 我正在使用join功能 result=myrdd.join(myrdd) 但它给了我 [('b', ('c', 'c')), ('c', ('d', 'd')), ('a', ('

我的RDD如下所示:

myrdd=sc.parallelize([('a','b'),('a','c'),('b','c'),('c','d')))

我想打印RDD中的行,其中行的第二个元素和任何其他行的第一个元素是公共的。所以,我想做自我连接

我想要的结果是:

a,b,c
,因为
a,b
b,c
都存在于我的RDD中

我正在使用
join
功能

result=myrdd.join(myrdd)

但它给了我

[('b', ('c', 'c')),
 ('c', ('d', 'd')),
 ('a', ('b', 'b')),
 ('a', ('b', 'c')),
 ('a', ('c', 'b')),
 ('a', ('c', 'c'))]
我做错了什么


编辑:所需输出:
(a,b,c)
(a,c,b)
(但不是两者)

您可以在结果上使用筛选器排除键的两个值不相同的结果

myrdd = sc.parallelize([('a','b'),('a','c'),('b','c'),('c','d')])

result = myrdd.join(myrdd)

#Output 

[('a', ('b', 'b')), ('a', ('b', 'c')), ('a', ('c', 'b')), ('a', ('c', 'c')), ('b', ('c', 'c')), ('c', ('d', 'd'))]

a = result.filter(lambda x:x[1][0] !=x[1][1])

#Output 

[('a', ('b', 'c')), ('a', ('c', 'b'))]
您还可以将这两种操作结合起来:

myrdd.join(myrdd).filter(lambda x:x[1][0] !=x[1][1]).collect()

[('a','b'),('a','c'),('b','c'),('c','d')]连接[('a','b'),('a','c'),('b','c'),('c','d')],因此从左侧,它将'a'与右侧的相应值匹配,即'b'和'c'。因此它返回(a,('b','c'),(a,('b','b'),(a,('c','b'),(a,('c','c')),(a,('c','c'))。现在让我们看一条记录(a,('b','c')),这里a是键,'b'是来自左侧RDD的键的值,'c'是来自右侧RDD的键'a'的值。一切都是正确的。您期望的结果(a,('b','c'))也在结果中。我不希望结果RDD中的其他行,例如b,(c,c)或a,(c,c)。我如何删除它们?您正在寻找
result=myrdd.join(myrdd.map(lambda x:(x[1]))
?发布所需的输出。@pault更新了!有什么方法可以删除重复项,如(a,(b,c))和(a,(c,b))?