2017-09-12 4 views
0

Ich bin neu in Scala, lernen es für Apache-Funke. Ich schrieb eine einfache Funktion in scala für GraphX ​​scala type Mismatch Fehler in graphX ​​code

def foo(edge: EdgeTriplet[Map[Long, Double], Double]): Iterator[(VertexId, Map[Long, Double])] = { 

    val m = edge.srcAttr 

    for((k, v) <- m){ 
     if (v + edge.attr < edge.dstAttr.getOrElse(k, 10.0)) 
      Iterator(edge.dstId, Map(k -> v + edge.attr)) 

     else 

      Iterator.empty 

    } 

} 

Fehler

Name: Compile Error 
Message: <console>:37: error: type mismatch; 
found : Double 
required: String 
        Iterator(edge.dstId, Map(k -> v + edge.attr)) 
                 ^
<console>:35: error: type mismatch; 
found : Unit 
required: Iterator[(org.apache.spark.graphx.VertexId, Map[Long,Double])] 
    (which expands to) Iterator[(Long, Map[Long,Double])] 
      for((k, v) <- m){ 
        ^
StackTrace: 

Warum scala ist v als String Behandlung? und was ist die Ursache für den zweiten Fehler?

Nach der Bearbeitung des Codes, wie durch @Alexey vorgeschlagen, ich Fehler immer

Name: Compile Error 
Message: <console>:30: error: type mismatch; 
found : scala.collection.immutable.Map[org.apache.spark.graphx.VertexId,scala.collection.immutable.Map[Long,Double]] 
    (which expands to) scala.collection.immutable.Map[Long,scala.collection.immutable.Map[Long,Double]] 
required: Iterator[(org.apache.spark.graphx.VertexId, Map[Long,Double])] 
    (which expands to) Iterator[(Long, Map[Long,Double])] 
       (k, v) <- edge.srcAttr 
         ^
StackTrace: 

Wenn es hilft, ich bin der Umsetzung eine andere Version der Sendmessage-Funktion von diesem code

Antwort

1

Die erste ist ein gemeinsames Problem mit + in Scala, leider. In diesem Fall haben Sie nicht k -> (v + edge.attr), wie Sie wahrscheinlich erwartet haben, aber (k -> v) + edge.attr. Und die einzige + Methode auf einem Tuple2 akzeptiert String. Um es zu beheben, fügen Sie einfach die richtigen Klammern hinzu.

Der zweite Fehler ist, weil for(...) { ... }Unit zurückgibt (es wird in einen foreach Anruf übersetzt). Sie vermissen yield. In der Tat, wenn Sie for verwenden möchten, sollte es so etwas wie

for { 
    (k, v) <- m 
    x <- if (v + edge.attr < edge.dstAttr.getOrElse(k, 10.0)) 
     Iterator((edge.dstId, Map(k -> (v + edge.attr)))) 
    else 
     Iterator.empty[(Long, Map[Long,Double])] 
} yield x 

ich es als

m.flatMap { case (k, v) => 
    if (v + edge.attr < edge.dstAttr.getOrElse(k, 10.0)) 
    Iterator((edge.dstId, Map(k -> (v + edge.attr)))) 
    else 
    Iterator.empty[(Long, Map[Long,Double])] 
} 
+0

Erster Fehler schreiben würde es vorziehen, sein hat beschlossen, dank Ihrer Lösung. Suche noch nach Lösung – ashwinids

+0

Siehe die bearbeitete Antwort. Ich habe es ursprünglich nicht entdeckt. –

+0

bitte können Sie den vollständigen Code der Lösungen für das zweite Problem schreiben, weil ich Fehlerkonflikt gefunden habe: Iterable [Any], benötigt Iterator [(Long, Map [Long, Double])] – ashwinids