2016-11-15 47 views
1
import org.apache.spark.graphx._ 

object Test { 
def main(args: Array[String]): Unit = { 
    val graph = GraphGenerator.generate_graph() 
    println(graph.numEdges) 
    println(solve(graph)) 
} 

def solve[A,B](graph: Graph[A,B]) = { 
    graph.numEdges 
} 
} 

为什么graph.numEdges在main函数中正常工作,而不是在求解?Scala GraphX中的通用方法

编译器输出:numEdges不是图[A,B]的成员。

如果我改变graph.numEdges graph.edges.count()它的作品。

回答

1

如果Graph[A,B]不具有val numEdges而背后的实际类别会发生。

编辑:val numEdges来自GraphOps

class GraphOps[VD: ClassTag, ED: ClassTag](graph: Graph[VD, ED]) extends Serializable { /** The number of edges in the graph. */ @transient lazy val numEdges: Long = graph.edges.count()

其中Graph隐含获得:

abstract class Graph[VD: ClassTag, ED: ClassTag] protected() extends Serializable { ... implicit def graphToGraphOps[VD: ClassTag, ED: ClassTag] (g: Graph[VD, ED]): GraphOps[VD, ED] = g.ops

但只有当VD和ED(在本例中A,B)是scala.reflect.ClassTag s - 而你的求解函数并不要求这样,所以隐式转换不会发生。

2

GraphOps方法需要ClassTag来解决类型擦除。您可以将您的功能定义为:

import scala.reflect.ClassTag 

def solve[A: ClassTag, B: ClassTag](graph: Graph[A, B]) = graph.numEdges