簡體   English   中英

我應該在兩個不同的 RDD 上重用 HashPartitioner 嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM