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。例如,您可以将
combineByKey
与 mapSideCombine
组合设置为 false
.
- 如果您可以接受一些数据丢失,您可以使用一组布隆过滤器,但需要额外的工作。
- 如果数据是可排序的,您可以尝试使用外部排序,然后进行线性扫描,以避免将哈希映射存储在内存中。对于初学者,您可以查看
repartitionAndSortWithinPartitions
和 ExternalSorter
.
- 如果 RDD 设置了分区器(例如,是某种
byKey
操作的结果),您只能根据数据量执行精确选择的局部不同操作。
给定一个 initial: PairRDD[(Long, Long)]
,得到一个 other: PairRDD[(Long, Long)]
且每对 initial
只包含一次的最有效方法是什么? (即过滤掉重复的对。)
具体来说,有没有比initial.distinct()
更高效的东西?
在一般情况下,当您不对数据分布做出任何假设并且需要准确的结果时,distinct
几乎实现了一个最小的正确解决方案,其中:
- 为每个初始分区删除重复项
- 打乱数据
- 为每个洗牌输出删除重复项
所以除非你想修改内部结构,否则你在这里可以改进的地方不多。
也就是说,如果您可以做出一些假设和/或减少要求,您就可以改进它。
- 如果您希望重复项很少见,您可以避免 map side combine 以减少初始阶段的内存使用和 GC。例如,您可以将
combineByKey
与mapSideCombine
组合设置为false
. - 如果您可以接受一些数据丢失,您可以使用一组布隆过滤器,但需要额外的工作。
- 如果数据是可排序的,您可以尝试使用外部排序,然后进行线性扫描,以避免将哈希映射存储在内存中。对于初学者,您可以查看
repartitionAndSortWithinPartitions
和ExternalSorter
. - 如果 RDD 设置了分区器(例如,是某种
byKey
操作的结果),您只能根据数据量执行精确选择的局部不同操作。