2016-05-13 67 views
1

我還是新來的Scala上下文邊界,我試圖編寫一個函數,可以在任何滿足上下文綁定的泛型上執行reduceByKey。 如將spark reduceByKey應用於具有上下文邊界的泛型

def myReduce[K: ClassTag, V: ClassTag: Numeric[V]](in: RDD[(K, V)]): RDD[(K, V)] = { 
    in.reduceByKey{case (v1, v2) => 
    implicityly[Numeric[V]].plus(v1, v2) 
    } 

據我理解但是這應該工作試圖編譯我收到以下錯誤時。

  1. 錯誤:無法找到參數e內含價值:數字
  2. 錯誤:數字[V]不帶類型參數

這些我不明白。 我沒有在任何地方將類型參數傳遞給Numeric [V]。上下文綁定也不應該自動導入轉換的「證據」?

我希望改爲最終使用我自己的特質,而不是數字。

編輯:

我想明確的功能寫隱含evdience如下:

def myReduce[K: ClassTag, V: ClassTag](in: RDD[(K, V)])(implicit ev: V => Numeric[V]): RDD[(K, V)] = { 
    in.reduceByKey{case (v1, v2) => 
    implicityly[Numeric[V]].plus(v1, v2) 
    } 

但我仍然得到「錯誤:無法找到參數e內含價值:數字」錯誤。

回答

1

行,所以我解決了問題

def myReduce[K: ClassTag, V: ClassTag: Numeric](in: RDD[(K, V)]): RDD[(K, V)] = { 
    in.reduceByKey{case (v1, v2) => 
    implicityly[Numeric[V]].plus(v1, v2) 
    } 

問題被指定數值[V],而不僅僅是數字。 我現在遇到了更多問題,但那是另一天。