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

如何在Spark中加入之前正确应用HashPartitioner?

堵存
2023-03-14

为了减少两个rdd连接时的混乱,我决定首先使用HashPartitioner对它们进行分区。我是这样做的。我这样做对吗,或者有更好的方法吗?

val rddA = ...
val rddB = ...

val numOfPartitions = rddA.getNumPartitions

val rddApartitioned = rddA.partitionBy(new HashPartitioner(numOfPartitions))
val rddBpartitioned = rddB.partitionBy(new HashPartitioner(numOfPartitions))

val rddAB = rddApartitioned.join(rddBpartitioned)

共有2个答案

章永安
2023-03-14

只有一条注释,最好附加<code>。persist()在之后。partitionBy如果rddApartitionedand有多个操作,否则,所有操作都将评估 的整个谱系,这将导致哈希分区一次又一次地发生。

val rddApartitioned = rddA.partitionBy(new HashPartitioner(numOfPartitions)).persist()
val rddBpartitioned = rddB.partitionBy(new HashPartitioner(numOfPartitions)).persist()

夏景同
2023-03-14

为了减少两个RDD连接期间的随机排序,

令人惊讶的是,人们普遍认为重新命名可以减少甚至消除洗牌。事实并非如此。重新分区是以最纯粹的形式进行的洗牌。它不会节省时间、带宽或内存

使用主动分区器背后的原理是不同的——它允许您进行一次洗牌,并重复使用状态,以执行多个按键操作,而不需要额外的洗牌(尽管据我所知,不一定没有额外的网络流量,因为共分区并不意味着同一位置,不包括在单个操作中发生洗牌的情况)。

所以你的代码是正确的,但是在你加入一次的情况下,它不会给你买任何东西。

 类似资料:
  • 问题内容: 好的,所以我一直在尝试使用以下代码加载BufferedImage: 但是,这在运行时给了我一个类型转换错误,那么如何正确加载BufferedImage? 问题答案: 使用来代替:

  • 问题内容: 当我在Python中打开FIFO(命名管道)进行写入时,发生了非常奇怪的事情。考虑一下当我尝试打开FIFO以便在交互式解释器中进行写入时发生的情况: 以上行将阻塞,直到我打开另一个解释器并键入以下内容: 我不明白为什么我必须等待打开管道进行读取,但是让我们跳过它。上面的代码将阻塞,直到有可用的数据为止。但是,假设我回到第一个解释器窗口并输入: 预期的行为是,在第二个解释器上,对的调用将

  • 我正在尝试导入一个jar文件。我的文件“test.java”包含一行: 注意:我使用的是Mac电脑。

  • “java.lang.OutOfMemoryError” .我想是因为我用了毕加索在我的RecycleView适配器。 代码如下:

  • 问题内容: 我正在使用Selenium IDE为我的站点编写测试,但是我无法让selenium使用上一个同级按钮单击按钮 我自己的路 问题答案: 您无需升级并使用,因为所有按钮都处于同一级别:

  • 我试图通过手动将图像拖到eclipse或导入来解决这个问题。但正如下图所示,这些图像总是碰巧是一个文本文件。请帮忙! 放大,你可以看到导入的图像是一个文本文件,在这里输入图像描述 当我打开它: 在此输入图像描述