2017-01-16 2 views
1

Ich habe begonnen, einige Spark \ Scala \ GraphX ​​zu lernen, um es mit Pregel zu verwenden, ich habe einige einfachen Code hier gefunden: http://www.cakesolutions.net/teamblogs/graphx-pregel-api-an-example und wollte es versuchen. Also habe ich versucht, diesen Code zu kompilieren, wie ich es gedacht sein sollte (es ist mein erstes Mal mit Scala):Scala: Kompilierung Fehler: nicht gefunden Typ

/* SimpleApp.scala */ 
import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._ 
import org.apache.spark.SparkConf 
import org.apache.spark._ 
import org.apache.spark.graphx._ 
import org.apache.spark.rdd.RDD 

class Graph[VD, ED] (
     val vertices: VertexRDD[VD], 
     val edges: EdgeRDD[ED]) { 
} 

object SimpleApp { 
    val initialMsg = 9999 

def vprog(vertexId: VertexId, value: (Int, Int), message: Int): (Int, Int) = { 
    if (message == initialMsg) 
     value 
    else 
     (message min value._1, value._1) 
} 

def sendMsg(triplet: EdgeTriplet[(Int, Int), Boolean]): Iterator[(VertexId, Int)] = { 
    val sourceVertex = triplet.srcAttr 

    if (sourceVertex._1 == sourceVertex._2) 
     Iterator.empty 
    else 
     Iterator((triplet.dstId, sourceVertex._1)) 
} 

def mergeMsg(msg1: Int, msg2: Int): Int = msg1 min msg2 

def pregel[A] 
    (initialMsg: A, 
    maxIter: Int = Int.MaxValue, 
    activeDir: EdgeDirection = EdgeDirection.Out) 
    (vprog: (VertexId, VD, A) => VD, 
    sendMsg: EdgeTriplet[VD, ED] => Iterator[(VertexId, A)], 
    mergeMsg: (A, A) => A) 
: Graph[VD, ED] 

def main(args: Array[String]) { 
    val conf = new SparkConf().setAppName("Simple Application") 
    val sc = new SparkContext(conf) 

    val minGraph = graph.pregel(initialMsg, 
          Int.MaxValue, 
          EdgeDirection.Out)(
          vprog, 
          sendMsg, 
          mergeMsg) 

    minGraph.vertices.collect.foreach{ 
     case (vertexId, (value, original_value)) => println(value) 
    } 

    sc.stop() 
    } 
} 

Aber ich bekomme diese Fehlermeldung:

$ C:\"Program Files (x86)"\sbt\bin\sbt package 
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0 
[info] Set current project to Simple Project (in build file:/C:/spark/simple/) 
[info] Compiling 1 Scala source to C:\spark\simple\target\scala-2.10\classes... 
[error] C:\spark\simple\src\main\scala\SimpleApp.scala:42: not found: type VD 
[error]   : Graph[VD, ED] 
[error]    ^
[error] C:\spark\simple\src\main\scala\SimpleApp.scala:42: not found: type ED 
[error]   : Graph[VD, ED] 
[error]     ^
[error] C:\spark\simple\src\main\scala\SimpleApp.scala:39: not found: type VD 
[error]   (vprog: (VertexId, VD, A) => VD, 
[error]       ^
[error] C:\spark\simple\src\main\scala\SimpleApp.scala:39: not found: type VD 
[error]   (vprog: (VertexId, VD, A) => VD, 
[error]          ^
[error] C:\spark\simple\src\main\scala\SimpleApp.scala:40: not found: type VD 
[error]   sendMsg: EdgeTriplet[VD, ED] => Iterator[(VertexId, A)], 
[error]        ^
[error] C:\spark\simple\src\main\scala\SimpleApp.scala:40: not found: type ED 
[error]   sendMsg: EdgeTriplet[VD, ED] => Iterator[(VertexId, A)], 
[error]         ^
[error] C:\spark\simple\src\main\scala\SimpleApp.scala:35: only classes can have declared but undefined members 
[error]   def pregel[A] 
[error]   ^
[error] C:\spark\simple\src\main\scala\SimpleApp.scala:48: not found: value graph 
[error]     val minGraph = graph.pregel(initialMsg, 
[error]        ^
[error] 8 errors found 
[error] (compile:compileIncremental) Compilation failed 
[error] Total time: 5 s, completed Jan 17, 2017 12:35:00 AM 

Ich bin ziemlich neu in Scala also verstehe ich nicht genau VD \ ED Rolle in diesen definiert.

Antwort

2

Das Problem ist, dass Sie nicht einen Typ für Ihre Methodendefinition verwenden können, die nicht als Typparameter irgendwo im Geltungsbereich deklariert wurde (z. B. diese Methode oder die Klasse usw.).

Betrachten Sie Ihre Methode . Es gibt einen Wert vom Typ Graph[VD, ED] zurück. Aber wie kann Compiler wissen, was VD bezieht? Ohne sich in das, was Ihr Code tut, um dieses Problem zu beheben ist einfach, wenn Sie nur VD als Parameter Methode Typ hinzufügen:

def pregel[A, VD] 

Beachten Sie, dass, wenn pregel eine Methode innerhalb der Klasse waren Graph, es wäre in Ordnung, weil Graph definiert dieser Typ: class Graph[VD, ED]. Durch den Code, den Sie gepostet haben, scheint es, dass Ihre Methoden in der Mitte von Nirgendwo verweilen, was nicht erlaubt ist - vielleicht sollten Sie darüber nachdenken, sie in die Klasse Graph zu verschieben?

Verwandte Themen