2017-01-16 10 views
1

Spark \ Scala \ GraphXをPregelで使用する方法を学び始めました。ここにいくつかの簡単なコードが見つかりました: です。Scala:コンパイルエラー:タイプが見つかりません

/* 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() 
    } 
} 

をしかし、私はこのエラーを取得する:私はそれがあるべきと思ったよう は、だから私は(それはスカラ座での私の最初の時間です)このコードをコンパイルしようとした

$ 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 

私はスカラ座にかなり新しいですよ私はこれらの定義でVD \ EDの役割を正確に理解していません。

答えて

2

問題は、タイプパラメータとしてスコープのどこかに宣言されていないメソッド定義(たとえば、そのメソッドやクラスを含むなど)に型を使用できないということです。

def pregel[A]をご覧ください。タイプGraph[VD, ED]の値を返します。しかし、どのようにコンパイラはVDについて言及しているのですか?あなただけのメソッドの型パラメータとしてVDを追加した場合、あなたのコードが何をするかに得ることなく、この問題を修正するのは簡単です:pregelがクラスGraph内の方法であれば、それはGraph定義するためOKだろうと

def pregel[A, VD] 

注意そのタイプ:class Graph[VD, ED]。あなたが投稿したコードでは、あなたのメソッドがどこにも残っていないように見えますが、これは許可されていません - Graphクラスの中にそれらのメソッドを移動することを検討したいでしょうか?

関連する問題