[英]Should I reuse a HashPartitioner on two different RDDs?
在所有示例中,我總是看到 partitionBy 接收一個 HashPartitioner 的新實例
val rddTenP = rdd.partitionBy(new HashPartitioner(10))
我正在加入兩個 RDD。 它們的鍵列具有來自同一組userId
值。 我應該對它們進行分區以提高連接效率嗎? 如果是,我應該創建一個 HashPartitioner 實例 hp
val hp: HashPartitioner = new spark.HashPartitioner(84)
並將 hp 傳遞給兩個 partitionBy 方法,以便讓要加入的行落到同一個節點? 這是 partitionBy 的工作方式嗎?
您正在使用相同的分區器來優化您的連接(通過避免洗牌)的正確方法。 您可以使用哈希分區器的相同實例,因為它是不可變的。 但是,如果您使用 2 個具有相同分區參數數量的哈希分區器實例(粗略地說,partitionIndex = key.hasCode mod numOfPartitions),它也可以工作,因為它們是相等的:
override def equals(other: Any): Boolean = other match {
case h: HashPartitioner =>
h.numPartitions == numPartitions
case _ =>
false
}
有關其工作原理的詳細信息和詳細說明,請參閱: https : //github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/Partitioner.scala以及HashPartitioner 是如何工作的?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.