Spark Custom Partioner与SortByKey功能

时间:2016-04-22 10:58:05

标签: apache-spark rdd bigdata

给定[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)

1 个答案:

答案 0 :(得分:2)

如果您只考虑join表现并假设缓存sortedcustom_partitioned个RDD,则应该存在实际差异。这两种:

rdd.sortBy(_._1)

rdd.partitionBy(somePartitione)

将导致分区的RDD,并且后续cogroup将利用此分区。

如果您考虑整个过程,包括sortBy / partitionBy,那么第二个选项应该更便宜,因为它不需要初始统计和本地排序。在某些情况下,当你期望高度偏斜的密钥分发时,基于排序的方法更可取,但在基数非常低的情况下它不会帮助你。如果您认为可能是这种情况,您可以考虑使用笛卡尔积,然后使用滤波器,但这应该作为最后的手段使用。