假设我在 rdd1 上调用了三个 RDD 转换函数:
def rdd2 = rdd1.f1
def rdd3 = rdd2.f2
def rdd4 = rdd3.f3
现在我要缓存rdd4
,因此我致电rdd4.cache()
。
我的问题:
仅缓存rdd4
上的操作的结果,还是缓存rdd4
以上的每个 RDD ?假设我要缓存rdd3
和rdd4
,我是否需要单独缓存它们?
答案 0 :(得分:21)
缓存的整个想法是,除非你告诉它,否则spark不会将结果保存在内存中。因此,如果您在链中缓存最后一个RDD,它只会将该结果保存在内存中。所以,是的,您确实需要单独缓存它们,但请记住,如果要多次使用它,您只需要缓存RDD,例如:
rdd4.cache()
val v1 = rdd4.lookup("key1")
val v2 = rdd4.lookup("key2")
如果在这种情况下不调用缓存,则每次调用查询(或任何其他需要评估的函数)都会重新计算rdd4。您可能希望阅读paper on RDD's这很容易理解,并解释了他们就RDD的工作方式做出的某些选择背后的想法。