spark-持久后两次RDD过程

时间:2018-11-22 01:06:12

标签: apache-spark

我制作了一个RDD,并从如下所示的原点创建了另一个RDD。

val RDD2 = RDD1.map({
  println("RDD1")
  ....
}).persist(StorageLevel.MEMORY_AND_DISK)

RDD2.foreach({
  println("RDD2")
  ...
})
...so on..

我希望RDD1的进程只执行一次,因为RDD1是通过persist方法保存在内存或磁盘上的。

但是在如下所示的“ RDD2”之后以某种方式打印“ RDD1”。

RDD1
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2
RDD1 -- repeat RDD1 process. WHY? 
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2

1 个答案:

答案 0 :(得分:1)

这是火花的预期行为。像大多数操作一样,持续执行火花也是惰性操作。因此,即使您为第一个RDD添加了持久性,除非您在持久性操作之后添加任何操作,否则spark不会缓存数据。映射操作不是火花操作,也是惰性的。

实施缓存的方法是在count保留之后添加RDD2操作

val RDD2 = RDD1.map({
   println("RDD1")
   ....
}).persist(StorageLevel.MEMORY_AND_DISK)

RDD2.count // Forces the caching 

现在,如果您执行任何其他操作,则不会重新计算RDD2

相关问题