我在下面创建了2个Rdd
rdd=sc.parallelize([(0,'A'),(0,'B'),(1,'D'),(1,'B'),(1,'C'),(2,"A"),(2, "B"),(2, "E")])
rdd1=rdd.groupByKey().map(lambda x :list(x[1]))
rdd1.collect()
[['A', 'B'], ['D', 'B', 'C'], ['A', 'B', 'E']]
rdd2=sc.parallelize(['D','E'])
rdd2.collect()
Out[204]: ['D', 'E']
现在,我想从rdd1中删除元素,如果它出现在rdd2中。
我在rdd2 ('D','E')
内有2个元素
现在我要从rdd1中删除此元素。
我期望的rdde3是:
[['A', 'B'], ['B', 'C'], ['A', 'B']]
答案 0 :(得分:0)
首先将第二个rdd的所有元素收集到一个列表中。应用过滤条件,然后进行分组。
from pyspark import SparkContext
sc = SparkContext('local')
rdd=sc.parallelize([(0,'A'),(0,'B'),(1,'D'),(1,'B'),(1,'C'),(2,"A"),(2, "B"),(2, "E")])
print(rdd.collect())
rdd1=rdd.groupByKey().map(lambda x :list(x[1]))
list1 = rdd1.collect()
print(list1)
rdd2=sc.parallelize(['D','E'])
list2 =rdd2.collect()
print(list2)
rdd2list = rdd2.collect()
filteredrdd = rdd.filter(lambda x: x[1] not in rdd2list)
finalrdd=filteredrdd.groupByKey().map(lambda x :list(x[1]))
print(finalrdd.collect())
这是finalrdd输出:
[['A', 'B'], ['B', 'C'], ['A', 'B']]
根据您的评论进行更新:
def filter_list(x):
return [ele for ele in x if ele not in rdd2list]
final2rdd = rdd1.map(lambda x: filter_list(x))
print(final2rdd.collect())
这是final2rdd的输出,与之前相同:
[['A', 'B'], ['B', 'C'], ['A', 'B']]