我应该在两个不同的RDD上重用HashPartitioner吗?

时间:2016-05-05 17:59:10

标签: scala apache-spark

在所有示例中,我总是看到partitionBy收到HashPartitioner的 new 实例

  

val rddTenP = rdd.partitionBy(new HashPartitioner(10))

我正在加入两个RDD。它们的键列具有来自同一组userId的值。我应该对它们进行分区以使连接更有效吗?如果是,我应该创建一个HashPartitioner实例hp

  

val hp: HashPartitioner = new spark.HashPartitioner(84)   并将hp传递给这两个partitionBy方法,以便将要连接的行放到同一个节点上?这是partitionBy的工作方式吗?

1 个答案:

答案 0 :(得分:1)

您使用相同的分区程序以正确的方式优化您的联接(通过避免随机播放)。您可以使用相同的散列分区实例,因为它是不可变的。但是如果你使用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.scalaHow does HashPartitioner work?