[英]PySpark: How to remove duplicates from a RDD by first occurance?
如何删除RDD中键的重复项并保持键的最少出现次数(键的一部分)?
键中比较值的示例:
RDD = [('2A',1),('2B',2),('2A',3),('1A',3),('1B',16)]
输出: [('1A',3),('2A',1),('2A',3)]
比较key[2:]
并保留所有出现的最小值。
例如,对于所有以 '2' 开头的键,(2One 和 2Two) 中的一个最小,所以我需要保留包含 2One 的所有键值。
编辑:编写以下答案是为了回答 OP 的原始问题,该问题是关于如何通过键删除重复项并仅保留那些具有最小值的。
sc.parallelize([(2,3),(2,1),(1,3),(1,0)]).
groupByKey().
map(lambda (x,y): (x,min(y))).
collect()
您所需要的只是首先按键分组,然后将每个元组映射到其值的最小值。
当你按键分组时,你会得到这样的东西:
[(1, [3,0]), (2, [3,1])]
从那里开始,使用min
和map
仅保留您想要的元组是一件简单的事情。
要回答新问题,
sc.parallelize([('2A',1),('2B',2),('2A',3),('1A',3),('1B',16)]).
groupByKey(). # groups together everything
groupBy(lambda (x,y): x[0]). #groups by digit 2, 1, etc. in key name
map(lambda (x,y): min(y)). # chooses smallest of 2A, 2B, etc.
map(lambda (x,y): (x,list(y))).collect()
产生[('1A', [3]), ('2A', [1, 3])]
,这足够接近了。
避免对大型数据集使用groupByKey
。 使用reduceByKey
sc.parallelize([('2A',1),('2B',2),('2A',3),('1A',3),('1B',16)])\
.reduceByKey(min)\
.collect()
RDD = [(2,3),(2,1),(1,3),(1,0)]
temp = {}
for item in RDD:
if item[0] not in temp.keys():
temp[item[0]] = []
temp[item[0]].append(item[1])
new_RDD = [(item[0], sorted(item[1])[0]) for item in temp.iteritems()]
print new_RDD
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.