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

可以在不重新分区的情况下手动更改Spark RDD的分区号吗?

卢嘉誉
2023-03-14

在Spark中,我有两个PairRDD(我们称之为A和B),每个由n个分区组成。我想根据它们的密钥加入这些RDD。

两个RDD都是一致分区的,也就是说,如果键x和y在RDD A中的同一个分区中,它们也在RDD B中的同一个分区中。对于RDD A,我可以保证分区是使用特定的分区器完成的。但是对于RDD B,分区索引可能不同于RDD A(RDD B是一些遗留库的输出,如果不是绝对必要的话,我不愿意碰它)。

我想在不执行洗牌的情况下有效地连接RDD A和B。理论上,如果我可以重新分配RDD B的分区号,使它们与RDD A中的分区号相匹配,这将是很容易的。

我现在的问题是:是否可以编辑RDD的分区号(基本上是排列它们)?或者,可以在不导致随机操作的情况下分配分区程序吗?还是您看到了解决我目前太盲目而看不到的任务的另一种方法

共有1个答案

姚海
2023-03-14

是的,您可以更改分区。但是为了减少混洗数据必须位于同一个集群节点上。

  1. 在数据源级别和/或使用 .partition 运算符控制分区
  2. 如果小型RDD可以容纳所有工作线程的内存,那么使用广播变量是更快的选择。

正如您所提到的,存在一致的分区,您无需重新分区(或编辑现有的分区数)。

请记住,数据托管的保证很难实现

 类似资料:
  • 我对再平衡有些怀疑。现在,我正在手动将分区分配给使用者。因此,根据文件,如果消费者离开/崩溃在一个消费群体中,就不会有再平衡。 假设同一组中有3个分区和3个使用者,每个分区都是手动分配给每个使用者的。一段时间后,第三个消费者倒下了。既然没有再平衡,我可以采取什么措施来确保停机时间最小化?我是否需要更改前两个分区中任何一个的配置,以从第三个分区或其他分区开始使用?

  • 我正在使用django模型。django设置中的TIMEZONE是UTC。并通过做一些算术来构建时间戳。 当我使用::timestamp时,时间戳返回为2021 07月26日00:00:00如果我使用::timestamp,它将变为2021 07月26日00:00:00,即使请求的\u时区是“美国/纽约” 我希望输出为2021 07月26日00:00:00-04:00,即显示与“附加美国/纽约”偏

  • 问题内容: 假设我有一个名为“ t”的表 考虑两个MYSQL查询 同时执行两个查询还会使“受影响的行”为0(即,不更新任何行),因为第一个查询是不更新的更新,第二个查询是不匹配的更新。 有什么办法可以区分这两种情况吗? 问题答案: 如果只需要“匹配”行的数量(而不是“已更改”行的数量),则可以按以下说明进行设置: http://dev.mysql.com/doc/refman/5.5/en/mys

  • 我的数据按数据静态分区,按国家动态分区。因此,每次约会,我可以有多达180个国家分区。看起来像这样: 对于每个日期,数据很小(大约20-100mb),它被划分在国家分区中。我想知道这样的情况,哪种方法会更好?重新分区还是合并?既然数据很小,合并会更好吗?我很困惑什么时候合并或重新分区会是更好的选择,这取决于数据的大小。

  • 问题内容: 我刚刚收到Java更新通知,说Update 17已经发布,所以我运行了更新,发现只有我的公共JRE被更新了。我仍然只有JDK的Update 16。 有没有办法自动提供最新的JDK? 当然,更新不应该放弃旧版本。这应该手动完成,因为Eclipse仍在使用旧版本。更新设置后,我将手动删除旧的JDK。 问题答案: 不在Windows上。如果要通过带有自动更新程序的Linux发行版来获取JDK

  • 问题内容: 之前有人问过这个问题,从答案来看它看起来并不好。我想考虑一下此示例代码… 我的应用程序将当前项目加载到提供它的服务中。有几个控制器可以在不重新加载商品的情况下操纵商品数据。 如果尚未设置,我的控制器将重新加载该项目,否则,它将在控制器之间使用该服务中当前加载的项目。 问题 :我想为每个控制器使用不同的路径,而无需重新加载Item.html。 1)有可能吗? 2)如果这不可能,那么与我在