2014-11-06 39 views
0

我做了以下内容:GraphX:无缓存错误输出()

var count = 0 
while(count > 0){ 
    val messages = graph.vertices.flatMap{ 
     // Create messages for other nodes 
    } 

    // Cache which is critical for the correct execution 
    count.cache() 
    count = messages.count() 

    val msgType1 = messages.filter() 
    val msgType2 = messages.filter() 


    println(count) 
    //Should be exactly messages.count() 
    println(msgType1.count() + msgType2.count()) 
    println("---") 
} 

如果我执行它正是这样,那么输出是:

8 
6 2 
--- 
11 
3 8 
--- 
0 
0 0 
--- 

这加起来正好到消息计数。

如果我在flatMap操作后删除count.cache(),那么在对消息进行计数之后,对消息的过滤是错误的。它看起来像计数清除消息或类似的东西。

的输出是:

8 
0 0 
--- 
0 
0 0 
--- 

这是为什么发生?如果我在那时使用缓存操作,或者它应该在没有缓存消息的情况下工作,那么我的程序是否可用?

回答

0

我的问题是,如果flatmap()在一次循环迭代中被调用一次,那么输出是正确的。

如果它在一次迭代中被调用两次(可能发生,如果消息必须重新计算),那么第一个输出是正确的,以下不是,因为我的flatmap()内的运算每个节点只能执行一次,节点多次。

所以如果我打电话给cache()平面地图只执行一次。如果没有缓存,每调用一次count()都要调用,所以第一个是正确的,后面两个错误。