簡體   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