2016-12-28 8 views
0

以下のコードは値の平均を見つけるために使用されています。なぜ暗黙的な数値かわかりません:平均関数で使用される数値[T]パラメータ。sparkの暗黙的なパラメータの使用

コード:

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を制限することができないことを意味します(一般的なオブジェクトの平均を実際に行うことはできません)。暗黙的に加えることによって、doubleに変換するtoDoubleメソッドがあることを確認します。

あなたはその変換関数を常に渡すことができますが、これは追加のパラメータを意味するので、代わりに数値が使用されます。 average(List( "bla"))のようなことをすれば、numを見つけることができないという苦情があります。

も参照してください。https://twitter.github.io/scala_school/advanced-types.html#otherbounds

関連する問題