Python 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])]) >

我有一个Spark 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])]
有人能帮我吗

另外两个选项:

  • 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)
      

  • 你能不能接受这个答案,或者解释一下为什么它不起作用,这样就可以改进它?提前感谢:)另外,如果你们觉得这个答案没用,请看一下,我会删除。