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

What is the most efficient way in Spark to get unique pairs in a PairRDD?

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

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

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

  • 为每个初始分区删除重复项
  • 打乱数据
  • 为每个洗牌输出删除重复项

所以除非你想修改内部结构,否则你在这里可以改进的地方不多。

也就是说,如果您可以做出一些假设和/或减少要求,您就可以改进它。

  • 如果您希望重复项很少见,您可以避免 map side combine 以减少初始阶段的内存使用和 GC。例如,您可以将 combineByKeymapSideCombine 组合设置为 false.
  • 如果您可以接受一些数据丢失,您可以使用一组布隆过滤器,但需要额外的工作。
  • 如果数据是可排序的,您可以尝试使用外部排序,然后进行线性扫描,以避免将哈希映射存储在内存中。对于初学者,您可以查看 repartitionAndSortWithinPartitionsExternalSorter.
  • 如果 RDD 设置了分区器(例如,是某种 byKey 操作的结果),您只能根据数据量执行精确选择的局部不同操作。