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

Scala 我应该在两个不同的RDD上重用HashPartitioner吗?,scala,apache-spark,Scala,Apache Spark,在所有示例中,我总是通过接收HashPartitioner的新实例来查看Partition val rddTenP=rdd.partitionBy(新的HashPartitioner(10)) 我将加入两个RDD。它们的键列具有来自相同集合的值userId。我是否应该对它们进行分区以使连接更有效?如果是,我应该创建一个HashPartitioner实例吗 val hp:HashPartitioner=newspark.HashPartitioner(84) 并将hp传递给两个partitionB

在所有示例中,我总是通过接收HashPartitioner的新实例来查看Partition

val rddTenP=rdd.partitionBy(新的HashPartitioner(10))

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

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


使用相同的分区器优化联接(通过避免混乱)是正确的。您可以使用相同的哈希分区器实例,因为它是不可变的。但是,如果使用具有相同分区数参数(大致为partitionIndex=key.hasCode mod numOfPartitions)的两个哈希分区器实例,它也可以工作,因为它们相等:

 override def equals(other: Any): Boolean = other match {
    case h: HashPartitioner =>
      h.numPartitions == numPartitions
    case _ =>
      false
  }
有关其工作原理的详细信息和详细说明,请参阅: 及

非常感谢。总之,在每个分区中使用
newhashpartitioner(10)
实际上会创建相同的HashPartitioner,因此会为相同的键创建相同的分区。。。