2017-06-07 23 views
0

MapReduceジョブを作成した後、spark/scalaを学習しています。Spark Error "stats()"を実行中:パラメータnumの暗黙の値を見つけることができませんでした。Numeric [Double]

私はHDFSでファイルを解析するのに役立つJava Beanをいくつか書きましたが、これを使ってsparkの進歩をスピードアップするのに役立ちます。

私は成功が私のファイルをロードし、私のJava Beanオブジェクトの配列を作成しなければならなかった:

val input = sc.textFile("hdfs://host:port/user/test/path/out") 
import my.package.Record 
val clust_recs = clv_input.map(line => new my.package.Record(line)) 
clust_recs.map(rec => rec.getPremium()).stats() 

しかし、最後の行は、このエラーを作成します。

<console>:46: error: could not find implicit value for parameter num: Numeric[Double]

私がテストしてみましたこのフィールドの値はすべて有効なので、私はこのエラーを引き起こす可能性のあるnull値がないことを確信しています。ここで

は、値の一例である:

val dblArray = clust_recs.map(rec => rec.getPremium()).filter(!isNaN(_)) 
dblArray.take(10) 

OUTPUT:

res82: Array[Double] = Array(1250.6, 433.72, 567.07, 219.24, 310.32, 2173.48, 195.0, 697.94, 711.46, 42.718050000000005) 

私はこのエラーを解決する方法の損失でだと私はちょうど使用しての概念を放棄する必要がある場合は疑問に思います私がすでに作成したJavaBeanオブジェクトです。

+0

は 'ケースクラスをmy.package.Record'です? –

+0

いいえ、my.package.RecordはJavaクラス(ゲッターとセッターを持つ伝統的なJava bean) –

+0

'Record.getPremium()'のシグニチャーは何ですか? –

答えて

0

にのみRDD[Double]またはTNumeric[T]に変換することができるRDD[T]ための暗黙的な変換によってRDD[T]上で利用可能なstatsオペレータ(the codeを参照のこと)を期待することができる:暗黙的な変換ものscaladocに記載されている

implicit def doubleRDDToDoubleRDDFunctions(rdd: RDD[Double]): DoubleRDDFunctions = { 
    new DoubleRDDFunctions(rdd) 
} 

implicit def numericRDDToDoubleRDDFunctions[T](rdd: RDD[T])(implicit num: Numeric[T]) 
    : DoubleRDDFunctions = { 
    new DoubleRDDFunctions(rdd.map(x => num.toDouble(x))) 
} 

DoubleRDDFunctions

Extra functions available on RDDs of Doubles through an implicit conversion.

ポイントは、次の行はnあなたはRDD[Double]を与えますが、何か他のものはです。

次のコンパイル・エラーの理由だ
clust_recs.map(rec => rec.getPremium()) 

error: could not find implicit value for parameter num: Numeric[Double]

Scalaのコンパイラはnumと呼ばれるNumeric[Double]暗黙の型変換を見つけることができません。

implicit def numericRDDToDoubleRDDFunctions[T](rdd: RDD[T])(implicit num: Numeric[T]) 
    : DoubleRDDFunctions = { 
    new DoubleRDDFunctions(rdd.map(x => num.toDouble(x))) 
} 

私は唯一のDoubleは、Javaのjava.lang.DoubleないScalaのDoubleので、コンパイル・エラーであることをを推測することができます。

0

私は正しい方向にJacekを取得してくれてありがとうございました。あなたの答えは、java.lang.Doubleをmap関数のscala.Doubleに変換する方法について詳しく調べています。

スカラーの新しいユーザーとして、私はJavaとの違い、特に暗黙的な変換を扱うために苦労しています。

私はこのポストは非常に役に立った:http://www.scala-archive.org/scala-Double-td1939353.html

、最終的にこれにコードを変更:

clust_recs.map(rec => rec.getPremium().doubleValue()).stats() 

OUTPUT:

res28: org.apache.spark.util.StatCounter = (count: 1000000, mean: 170.636, stdev: 28.13, max: 2180.000000, min: 0.000000) 
関連する問題