2015-10-16 4 views
1

у меня есть Спарк RDD, который выглядит следующим образом:Спарк РДД удалить записи с несколькими ключами

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

Может кто-нибудь помочь мне в этом?

+0

Не могли бы вы либо принять ответ или объяснить, почему это не работает, так что может быть лучше? Спасибо заранее :) – zero323

+0

Кроме того, если вы можете взглянуть на это http://stackoverflow.com/q/33157978/1560062 Если вы не найдете ответ полезным, я просто удалю. – zero323

ответ

1

Два других варианта:

  1. subtractByKey - это требует перетасовки так общая стоимость может быть похожа на groupByKey. При желании вы можете разделить вход RDD и preservesPartitioning набор в 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) 
    
  2. Broadcast переменной:

    • положительного фильтра - если вы ожидаете большое количество дублей

      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) 
      
Смежные вопросы