Spark RDD用多个键删除记录

2024-04-25 12:51:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Spark RDD,看起来像这样:

[(1, ...),
(1, ...),
(2, ...),
(3, ...)]

我正在尝试删除具有重复键的记录,在本例中,我希望排除具有键“1”的所有记录。我想要的最终输出应该是

^{pr2}$

到目前为止,我所做的一切都奏效了,但我的直觉认为应该有更好的解决方案:

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

有人能帮我吗?在


Tags: lambdalen记录解决方案filtersparkscprint
1条回答
网友
1楼 · 发布于 2024-04-25 12:51:09

其他两个选项:

  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. 广播变量:

    • 正滤波器-如果您希望有大量重复

      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)
      

相关问题 更多 >

    热门问题