Scala GraphX中的通用方法

时间:2016-11-15 19:40:03

标签: scala apache-spark spark-graphx

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函数中正常工作而且没有解决?

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

如果我将graph.numEdges更改为graph.edges.count(),则可以正常工作。

2 个答案:

答案 0 :(得分:2)

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

import scala.reflect.ClassTag

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

答案 1 :(得分:1)

如果Graph[A,B]没有val numEdgesgraph后面的实际班级有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

scala.reflect.ClassTag

但是只有当VD和ED(在我们的例子中是A,B)是$coefficient=10; $start=100; $end=200; for($i=$start;$i<$end;$i++){ echo $i.'<br>'; } s - 而你的求解函数不需要时,才会发生隐式转换。