【问题标题】:Should I reuse a HashPartitioner on two different RDDs?我应该在两个不同的 RDD 上重用 HashPartitioner 吗?
【发布时间】:2016-05-05 17:59:10
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: scala apache-spark


    【解决方案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?

    【讨论】:

    • 谢谢维塔利。总之,在每个 partitionBy 中使用 new HashPartitioner(10) 实际上会创建相同的 HashPartitioner,因此会为相同的键创建相同的分区...
    猜你喜欢
    • 2014-01-26
    • 2015-04-13
    • 2011-01-10
    • 2020-09-06
    • 2018-01-26
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多