2017-01-16 9 views
0

Привет, я очень новичок в Scala и пытаюсь запустить этот простой код, но я не могу его получить компилировать:Scala: abstract class: Compile Error: класс X должен быть абстрактным, поскольку: [ошибка] у него есть n нереализованных членов

/* 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 { 
    def main(args: Array[String]) { 
    val conf = new SparkConf().setAppName("Simple Application") 
    val sc = new SparkContext(conf) 

    // Create an RDD for the vertices 
    val vertices: RDD[(VertexId, (Int, Int))] = 
     sc.parallelize(Array((1L, (7,-1)), (2L, (3,-1)), 
         (3L, (2,-1)), (4L, (6,-1)))) 

    // Create an RDD for edges 
    val relationships: RDD[Edge[Boolean]] = 
     sc.parallelize(Array(Edge(1L, 2L, true), Edge(1L, 4L, true), 
         Edge(2L, 4L, true), Edge(3L, 1L, true), 
        Edge(3L, 4L, true))) 

    // Create the graph 
    val graph = Graph(vertices, relationships) 

    // Check the graph 
    graph.vertices.collect.foreach(println) 

    sc.stop() 
    } 
} 

И вот это файл SBT:

name := "Simple Project" 

version := "1.0" 

scalaVersion := "2.10.4" 

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.5.0" 

libraryDependencies += "org.apache.spark" %% "spark-graphx" % "0.9.0-incubating" 

Когда я пытаюсь скомпилировать его я получаю:

$ 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:10: class Graph needs to be abstract, since: 
[error] it has 2 unimplemented members. 
[error] /** As seen from class Graph, the missing signatures are as follows. 
[error] * For convenience, these are usable as stub implementations. 
[error] */ 
[error] val edges: org.apache.spark.graphx.EdgeRDD[ED] = ??? 
[error] val vertices: org.apache.spark.graphx.VertexRDD[VD] = ??? 
[error] class Graph[VD, ED] { 
[error]  ^
[error] one error found 
[error] (compile:compileIncremental) Compilation failed 
[error] Total time: 6 s, completed Jan 16, 2017 11:48:51 PM 

I «Я очень новый для Scala, и все, что мне нужно, это запустить небольшой и простой код, но я могу его собрать. Я попытался установить вершины и ребра на _, но затем я получил: unbound placeholder параметр для краев val.

ответ

1

Таким образом, вы определяете класс с двумя неопределенными методами. Поэтому он просит определить его как абстрактный.

Возможно, вы хотите что-то вроде этого:

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

Таким образом, вы определяете класс с двумя полями и конструктор по умолчанию, принятые 2 параметра (вершин и ребер) назначает соответствующее значение поля с одно и то же имя.

Ключевое слово val, помеченное в это место, означает, что вы хотите, чтобы эти параметры конструктора были доступны, как если бы они были полями класса.

Кроме того, если у вас нет конкретных требований, обработка этого с помощью простого кортежа будет более удобной.

1

[error] C:\spark\simple\src\main\scala\SimpleApp.scala:10: class Graph needs to be abstract, since:

[error] it has 2 unimplemented members.

Это сообщение было показано из сообщения об ошибке. Вам необходимо указать значения для неизменяемых полей vertices и edges в определении класса. Вы можете инициализировать их в теле конструктора с любым значением, как, скажем:

class Graph[VD, ED] { 
    val vertices: VertexRDD[VD] = /* calculation here */ 
    val edges: EdgeRDD[ED] = /* calculation here */ 
} 

или перечислить их в качестве аргументов конструктора, так что его пользователь может поставить значения, когда их экземпляры:

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

который на самом деле эквивалентен:

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