在下面的代码中,我创建了一个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)
答案 0 :(得分:0)
由于使用了您使用过的数组,值会更新。数组在Scala中是可变的。请参阅以下讨论。
Why no immutable arrays in scala standard library?
此外,cache
是Spark中的一种转换,它将RDD缓存在内存中。缓存只能避免从启动运行DAG。使用缓存时,将从内存中选取已处理的数据,而不是通过整个DAG并计算相同的数据。
缓存是Spark的一项功能,使其比MapReduce快10到100倍