在所有示例中,我总是看到partitionBy收到HashPartitioner的 new 实例
val rddTenP = rdd.partitionBy(new HashPartitioner(10))
我正在加入两个RDD。它们的键列具有来自同一组userId
的值。我应该对它们进行分区以使连接更有效吗?如果是,我应该创建一个HashPartitioner实例hp
val hp: HashPartitioner = new spark.HashPartitioner(84)
并将hp传递给这两个partitionBy方法,以便将要连接的行放到同一个节点上?这是partitionBy的工作方式吗?
答案 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.scala 和 How does HashPartitioner work?