2015-11-22 172 views
0

我有个问题,当RDD存储在内存中时。 可以说,我有这样的代码:Spark中的RDD持久性

val dataset = originalDataset 
    .flatMap(data => modifyDatasetFormat(data, mappingsInMap)) 
    .persist(StorageLevel.MEMORY_AND_DISK)  

到目前为止,我有存储在每个工作节点的内存RDD

问题: 如果我对这个RDD做了另一个转换或操作,这个持久性会停止吗?我应该创建另一个,还是与它没有任何关系?

如果我在这个RDD(e.x散列分区)中更改分区,这个持久性会停止存在,我应该创建另一个分区或者它没有任何关系?

感谢

回答

2

,如果我做另一变换或行动来此RDD,将在持久性停止存在

如果我在这个RDD更改分区(例如散列分区),这种持久性会不会存在

编号

转换(包括重新分区)不能改变现有的RDD,特别是它们不能不执行它。当然

  1. 转换的结果本身不会被持续;

  2. (正如Jem Tucker的评论中指出的那样)您需要转换持续的RDD,而不是您调用persist的那个RDD。 I.e.

    val dataset1 = originalDataset. 
        flatMap(data => modifyDatasetFormat(data, mappingsInMap)) 
    dataset1.persist(StorageLevel.MEMORY_AND_DISK) 
    val dataset3 = dataset1.map(...) 
    

    将重新计算dataset1。相反,你需要

    val dataset2 = dataset1.persist(StorageLevel.MEMORY_AND_DISK) 
    val dataset3 = dataset2.map(...) 
    
+0

所以换句话说....为创建我必须坚持它,并unpersist老one.Is是正确的每一个新的RDD? – Nick

+0

我相信你的第2点是不正确的,当你调用rdd时,返回值是'this'引用,所以你的两个例子实际上都是相同的。 –

+0

可以说你有这个:val dataset2 = dataset1.persist(StorageLevel.MEMORY_AND_DISK) val dataset3 = dataset2.foreach(...)。如果您对数据集2进行了转换,则必须将其保留并将其传递给数据集3。我对么? – Nick