繁体   English   中英

PySpark:如何通过第一次出现从 RDD 中删除重复项?

[英]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])]

从那里开始,使用minmap仅保留您想要的元组是一件简单的事情。


要回答新问题,

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM