2016-12-28 86 views
0

下面的代碼用於查找值的平均值。我不確定爲什麼在平均函數中使用隱式num:Numeric [T]參數。在火花中使用隱式參數

代碼:

val data = List(("32540b03",-0.00699), ("a93dec11",0.00624), 
       ("32cc6532",0.02337) , ("32540b03",0.256023), 
       ("32cc6532",-0.03591),("32cc6532",-0.03591))  

val rdd = sc.parallelize(data.toSeq).groupByKey().sortByKey()  

def average[T](ts: Iterable[T])**(implicit num: Numeric[T])** = {  
    num.toDouble(ts.sum)/ts.size  
} 

val avgs = rdd.map(x => (x._1, average(x._2))) 

請幫忙知道使用(隱NUM:數字[T])的原因參數。

回答

0

Scala沒有數字類型的超類。這意味着你不能限制T <:Number的平均值是有意義的(你不能真正做一般的通用對象)。通過添加隱式確保它有toDouble方法轉換爲double。

您可以始終傳遞該轉換函數,但這意味着一個額外的參數,所以使用數字。如果你會做一些像平均(列表(「bla」)),你會得到一個投訴,它無法找到一個數字。

另請參閱https://twitter.github.io/scala_school/advanced-types.html#otherbounds