我制作了一个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
答案 0 :(得分:1)
这是火花的预期行为。像大多数操作一样,持续执行火花也是惰性操作。因此,即使您为第一个RDD添加了持久性,除非您在持久性操作之后添加任何操作,否则spark不会缓存数据。映射操作不是火花操作,也是惰性的。
实施缓存的方法是在count
保留之后添加RDD2
操作
val RDD2 = RDD1.map({
println("RDD1")
....
}).persist(StorageLevel.MEMORY_AND_DISK)
RDD2.count // Forces the caching
现在,如果您执行任何其他操作,则不会重新计算RDD2