2016-12-28 33 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