我有pyspark.rdd.PipelinedRDD
名为myRDD
。这是其样本内容:
[((111, u'BB', u'A'), (444, u'BB', u'A')),
((222, u'BB', u'A'), (888, u'BB', u'A')),
((333, u'BB', u'B'), (999, u'BB', u'A')),...]
我需要删除第三列值不重合的所有条目。预期的结果是这一个:
[((111, u'BB', u'A'), (444, u'BB', u'A')),
((222, u'BB', u'A'), (888, u'BB', u'A')),...]
我该怎么做?
答案 0 :(得分:2)
您可以使用带有lambda表达式的过滤器来检查每个元组对的第三个元素是否相同,例如:
l = [((111, u'BB', u'A'), (444, u'BB', u'A')),
((222, u'BB', u'A'), (888, u'BB', u'A')),
((333, u'BB', u'B'), (999, u'BB', u'A'))]
rdd = sc.parallelize(l)
rdd = rdd.filter(lambda x: x[0][2] == x[1][2])
result = rdd.collect()
print result
>>> [((111, u'BB', u'A'), (444, u'BB', u'A')), ((222, u'BB', u'A'), (888, u'BB', u'A'))]
要回答你的后续评论,请记住,lambda只是一个函数,如果你有更复杂的逻辑,你可以把它写成一个函数。你可以这样做:
def do_stuff(x):
if (x[0][2] == 'C') or (x[1][2] == 'C'):
return x
else:
if x[0][2] == x[1][2]: return x
return None
rdd = rdd.map(do_stuff).filter(lambda x: x is not None)
res = rdd.collect()