下面的代码用于查找值的平均值。我不确定为什么在平均函数中使用隐式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:Numeric [T])参数的原因。
答案 0 :(得分:0)
Scala没有数字类型的超类。这意味着你不能限制平均值的T<:数字有意义(你不能真正做普通对象的平均值)。通过添加隐式,您可以确保它具有转换为double的toDouble方法。
您可以始终传递该转换函数,但这意味着另外一个参数,因此使用数字。如果你会做一些像平均(List(“bla”))的事情,你会得到一个无法找到数字的投诉。
另见https://twitter.github.io/scala_school/advanced-types.html#otherbounds