2017-09-12 60 views
0

我是新來的scala,學習它爲apache-spark。我在斯卡拉寫了一個簡單的功能graphXgraphX代碼中的scala類型不匹配錯誤

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 

    } 

} 

錯誤

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: 

爲什麼Scala是治療v爲字符串?第二個錯誤的原因是什麼?

編輯代碼通過@Alexey的建議後,我收到提示

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: 

如果有幫助,我是從這個code

回答

1

第一個實現了不同版本的SendMessage函數是不幸的,在斯卡拉+是一個常見的問題。在這種情況下,您沒有k -> (v + edge.attr),正如您所預料的那樣,但是(k -> v) + edge.attr。並且Tuple2上唯一的+方法接受String。要修復它,只需添加正確的括號。

第二個錯誤是因爲for(...) { ... }返回Unit(它被翻譯爲foreach調用)。您缺少yield。如果您想使用for事實上,它應該像

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 

我更願意把它寫成

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

第一個錯誤已經解決了,感謝您的解決方案。仍然在尋找第二個解決方案 – ashwinids

+0

請參閱編輯答案。我原來並沒有發現它。 –

+0

請你可以寫解決方案的完整代碼到第二個問題,因爲我得到的錯誤不匹配:Iterable [Any],需要Iterator [(Long,Map [Long,Double])] – ashwinids