当前位置: 首页 > 知识库问答 >
问题:

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

钦楚青
2023-03-14

在所有示例中,我总是看到分区通过接收Hash分区器的新实例

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

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

val hp: Hash的分区=新火花。Hash的分区(84)并传递hp到两个分区方法,以便有要连接的行落到同一个节点?这是分区的工作方式吗?

共有1个答案

张兴旺
2023-03-14

使用相同的分区器优化连接(通过避免混洗)是正确的做法。您可以使用相同的hash partitioner实例,因为它是不可变的。但是,如果您使用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.scalaHashPartitioner是如何工作的?

 类似资料:
  • 我知道我可以一个RDD来增加它的分区,并使用coalesce来减少它的分区。关于这一点,我有两个问题,在阅读了不同的资源后,我无法完全理解。 当生成RDD时,Spark将使用合理的默认值(每个块1个分区,最初的版本是64MB,现在是128MB)。但是我也读到建议使用2到3倍于运行作业的内核数量。所以问题来了: > 一个给定的文件应该使用多少个分区?例如,假设我有一个10GB。拼花文件,3个执行器,

  • 我在Android-studio上编写了两个不同的应用程序(一个是我从头开始开发的,另一个已经开发了一段时间)。我已经将datepicker xml添加到两个应用程序中: 但其中一个是这样的: 另一个看起来是这样的:

  • 问题内容: 我正在构建使用Redis队列的Flask应用。工人的代码是: 另一个模块app.py包含用于处理Flask路由的代码。我的问题是,app.py是否应按以下方式创建新的Redis连接: 还是应该使用app.py 并使用该连接? 问题答案: 我会说使用新的连接,除非您确实有充分的理由不这样做(尽管我无法想象这样的原因)

  • 让我们假设我有一辆只有颜色和价格属性的普通车。价格取决于汽车的颜色。 由于汽车物体只会在颜色和相应的价格上有所不同,我应该只创建两个类,还是创建一个超类和两个子类更好,每个超类和两个子类都有自己的计算价格的方法?

  • 我有一个包含一个活动和两个片段的应用程序,在第一个片段中,我应该能够将数据插入数据库,在第二个片段中,我应该能够在一个RecyclerView中看到添加的项目。 所以我已经创建了数据库、我的RecyclerView适配器和ViewModel, 我是否应该在活动中初始化ViewModel,并以某种方式从片段中调用它来使用insert? 我是否应该在两个片段中初始化viewmodel两次? 我的代码如

  • 问题内容: 我正在使用Flamingo功能区和Substance Office 2007外观。 当然,现在 每个 控件都具有这种外观,即使对话框上也是如此。 我想要的是Office 2007中的功能,功能区具有Office 2007的外观,但其他控件保留其本机Vista / XP的外观。 是否可以为某些控件分配不同的外观?也许使用某种链接或代理外观? 问题答案: 我刚刚发现:由于物质5.0的SKI