Python Spark RDD使用多个键删除记录
我有一个Spark RDD,看起来像这样:Python Spark RDD使用多个键删除记录,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我有一个Spark RDD,看起来像这样: [(1, ...), (1, ...), (2, ...), (3, ...)] 我正在尝试删除具有重复键的记录,在本例中,我希望排除所有具有键“1”的记录。我想要的最终输出应该是 [(2, ...), (3, ...)] 到目前为止,我已经尝试过了,但我的直觉告诉我应该有一个更好的解决方案: >> a = sc.parallelize([(1,[1,1]), (1,[1,1]), (2,[1,1]), (3,[1,1])]) >
[(1, ...),
(1, ...),
(2, ...),
(3, ...)]
我正在尝试删除具有重复键的记录,在本例中,我希望排除所有具有键“1”的记录。我想要的最终输出应该是
[(2, ...),
(3, ...)]
到目前为止,我已经尝试过了,但我的直觉告诉我应该有一个更好的解决方案:
>> a = sc.parallelize([(1,[1,1]), (1,[1,1]), (2,[1,1]), (3,[1,1])])
>> print a.groupByKey() \
.filter(lambda x: len(x[1])==1 ) \
.map(lambda x: (x[0], list(x[1])[0] )).collect()
[(2, [1, 1]), (3, [1, 1])]
有人能帮我吗 另外两个选项:
subtractByKey
-这需要洗牌,因此总成本可以类似于groupByKey
。您可以选择对输入进行分区RDD
,并将preservespatiting
设置为True
:
from operator import add
counts = (a.keys()
.map(lambda x: (x, 1))
.reduceByKey(add))
duplicates = (counts
.filter(lambda x: x[1] > 1)
.map(lambda x: (x[0], None)))
a.subtractByKey(duplicates)
- 正过滤器-如果您希望大量重复
non_duplicated = sc.broadcast(set( counts.filter(lambda x: x[1] == 1).keys().collect() )) a.filter(lambda x: x[0] in non_duplicated.value)
duplicated = sc.broadcast(set( counts.filter(lambda x: x[1] > 1).keys().collect() )) a.filter(lambda x: x[0] not in duplicated.value)
- 负过滤器-如果预期重复数较少
non_duplicated = sc.broadcast(set( counts.filter(lambda x: x[1] == 1).keys().collect() )) a.filter(lambda x: x[0] in non_duplicated.value)
duplicated = sc.broadcast(set( counts.filter(lambda x: x[1] > 1).keys().collect() )) a.filter(lambda x: x[0] not in duplicated.value)
你能不能接受这个答案,或者解释一下为什么它不起作用,这样就可以改进它?提前感谢:)另外,如果你们觉得这个答案没用,请看一下,我会删除。