rdd.cache如何工作?

时间:2017-09-19 05:53:33

标签: apache-spark

在下面的代码中,我创建了一个rdd,缓存它并从中创建了子rdds。 vertexRDD - > newVert1 - > newVert2 - > newVert3 - > newVert4 - > newVert5。我在每个RDD中进行简单的增量操作。
当未启用缓存时,newVert1,newVert2,newVert3 RDD的数组值为

{{ URL::to('route/name', $params)) }}

但是当在parentRDD上调用缓存方法时,newVert1,newVert2,newVert3 RDD的数组值是

0:ArrayBuffer(1, 0, 0, 0)  0:ArrayBuffer(2, 0, 0, 0)  0:ArrayBuffer(3, 0, 0, 0) 
1:ArrayBuffer(0, 1, 0, 0)  1:ArrayBuffer(0, 2, 0, 0)  1:ArrayBuffer(0, 3, 0, 0)
2:ArrayBuffer(0, 0, 1, 0)  2:ArrayBuffer(0, 0, 2, 0)  2:ArrayBuffer(0, 0, 3, 0)
3:ArrayBuffer(0, 0, 0, 1)  3:ArrayBuffer(0, 0, 0, 2)  3:ArrayBuffer(0, 0, 0, 3)

这与RDD上的foreach方法有关。此方法是递增Array元素的值。

我已将结果作为评论发布在代码中。我已将结果作为注释发布在每个print语句下面。请帮助我理解缓存操作。感谢

0:ArrayBuffer(1, 0, 0, 0)  0:ArrayBuffer(3, 0, 0, 0)  0:ArrayBuffer(6, 0, 0, 0) 
1:ArrayBuffer(0, 1, 0, 0)  1:ArrayBuffer(0, 3, 0, 0)  1:ArrayBuffer(0, 6, 0, 0)
2:ArrayBuffer(0, 0, 1, 0)  2:ArrayBuffer(0, 0, 3, 0)  2:ArrayBuffer(0, 0, 6, 0)
3:ArrayBuffer(0, 0, 0, 1)  3:ArrayBuffer(0, 0, 0, 3)  3:ArrayBuffer(0, 0, 0, 6)

1 个答案:

答案 0 :(得分:0)

由于使用了您使用过的数组,值会更新。数组在Scala中是可变的。请参阅以下讨论。

Why no immutable arrays in scala standard library?

此外,cache是Spark中的一种转换,它将RDD缓存在内存中。缓存只能避免从启动运行DAG。使用缓存时,将从内存中选取已处理的数据,而不是通过整个DAG并计算相同的数据。

缓存是Spark的一项功能,使其比MapReduce快10到100倍