给定[K,V]的数据集并且需要基于密钥连接哪个方法提供了确保数据位置/速度的最佳方法自定义分区程序/哈希分区程序或使用SortBy()方法后跟连接方法?为什么一种方法比另一种更有效?
此外,如果您的大多数密钥都是相同的密钥,这会影响方法选择吗?
案例1
val rdd = sc.parallelize(Seq(("gh5", "id1"), ("gh4", "id1"), ("gh5", "id2"),("gh5", "id3"))
val sorted = rdd.sortBy(_._1)
val joined = sorted.join(sorted)
案例2
val rdd = sc.parallelize(Seq(("gh5", "id1"), ("gh4", "id1"), ("gh5", "id2"),("gh5", "id3"), ...)
val custom_partitioned = rdd.partitionBy(100)).persist()
val joined = custom_partitioned.join(custom_partitioned)
答案 0 :(得分:2)
如果您只考虑join
表现并假设缓存sorted
和custom_partitioned
个RDD,则应该存在实际差异。这两种:
rdd.sortBy(_._1)
和
rdd.partitionBy(somePartitione)
将导致分区的RDD,并且后续cogroup
将利用此分区。
如果您考虑整个过程,包括sortBy
/ partitionBy
,那么第二个选项应该更便宜,因为它不需要初始统计和本地排序。在某些情况下,当你期望高度偏斜的密钥分发时,基于排序的方法更可取,但在基数非常低的情况下它不会帮助你。如果您认为可能是这种情况,您可以考虑使用笛卡尔积,然后使用滤波器,但这应该作为最后的手段使用。