使用over-common列连接pyspark中的rdd
我的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', ('
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))?