当修改很少的值时,partitionBy(HashPartitioner)对缓存的RDD的影响

时间:2016-09-09 17:21:57

标签: scala apache-spark

我想知道当我放入缓存RDD然后通过修改有限数量的值来获取新的RDD时会发生什么。

  rdd.cache
  val rdd2 = rdd.map(x=>if(cond) partitionValue else x)

如果使用rdd2,RDD中没有触摸的部分仍然在缓存中?

此外,我需要更新分区,其中包含修改后的值,所以我

  val rdd2bis = rdd2.partitionBy(HashPartioner(nbPart))

我想为每个数据点迭代这个过程:

  • 查找哪个分区应该是一个值。
  • 修改我的值并使用partitionBy将其放在正确的分区中。

所以我的主要问题是,如果只有少数成员被修改,partitionBy是否在内存中保留输出RDD?

我知道partitionBy提供了一个新的RDD作为输出,但是有一些非修改的缓存值仍然存在于生成的RDD的缓存中。

1 个答案:

答案 0 :(得分:0)

  

我想知道当我放入缓存RDD然后通过修改有限数量的值来获取新的RDD时会发生什么。

如果你在字面上修改可变对象,你最终会得到不正确和不确定的编程。

  

如果使用rdd2,还没有触摸的rdd部分还在缓存中?

如果你map没有修改现有对象,它根本不会影响缓存数据。 rdd应该按原样缓存(除非由于内存问题而被驱逐),rdd2将不会。然而,数据未被复制,因此rdd2中的“未更改”记录引用与rdd相同的对象。

  

如果只有少数成员被修改,partitionBy会在内存中保留输出RDD

没有。 partitionBy需要标准的shuffle机制。它再次没有真正影响rdd的缓存状态。