Spark中最有效的方法是在PairRDD中获得唯一对?

时间:2016-07-12 13:41:27

标签: apache-spark rdd

给定initial: PairRDD[(Long, Long)],获得other: PairRDD[(Long, Long)]的最有效方法是什么,其中包含每对initial一次? (即过滤掉重复的对。)

具体来说,是否有比initial.distinct()更有效的东西?

1 个答案:

答案 0 :(得分:2)

在一般情况下,当您不对数据分布做出任何假设并且您需要确切的结果distinct实现了几乎最小的正确解决方案:

  • 为每个初始分区删除重复项
  • 随机播放数据
  • 为每个shuffle输出删除重复项

因此,除非您想要修改内部结构,否则您可以在此处进行改进。

如果你能做出一些假设和/或减少要求,你可以改进。

  • 如果您期望罕见的重复项,您可以避免映射端组合在初始阶段减少内存使用和GC。您可以使用combineByKey并将mapSideCombine组合设置为false来执行此操作。
  • 如果您可以接受一些数据丢失,您可以使用一组布隆过滤器,但需要额外的工作。
  • 如果数据是可订购的,您可以尝试使用外部排序,然后进行线性扫描,以避免将哈希映射存储在内存中。首先,您可以查看repartitionAndSortWithinPartitionsExternalSorter
  • 如果RDD具有分区设置(例如,某种byKey操作的结果),则只能根据数据量执行精确选择的本地类似操作。