2017-03-08 1 views
2

私はこのテストデータを持っている:approxQuantileはSpark(Scala)で不正確な中央値を与えますか?

val data = List(
     List(47.5335D), 
     List(67.5335D), 
     List(69.5335D), 
     List(444.1235D), 
     List(677.5335D) 
    ) 

私は中央値は69.5335であることを期待しています。 しかし、私はこのコードの正確な中央値を検索してみてください。

df.stat.approxQuantile(column, Array(0.5), 0) 

それは私を与える:444.1235

なぜ、これは、それが固定することができますどのようにでしょうか?

私はこのようにそれをやっている:

 val data = List(
     List(47.5335D), 
     List(67.5335D), 
     List(69.5335D), 
     List(444.1235D), 
     List(677.5335D) 
    ) 

     val rdd = sparkContext.parallelize(data).map(Row.fromSeq(_)) 
     val schema = StructType(Array(
     StructField("value", DataTypes.DoubleType, false) 
    )) 

     val df = sqlContext.createDataFrame(rdd, schema) 
     df.createOrReplaceTempView(tableName) 
val df2 = sc.sql(s"SELECT value FROM $tableName") 
val median = df2.stat.approxQuantile("value", Array(0.5), 0) 

は、だから私は、一時テーブルを作成しています。次に、内部を検索して結果を計算します。それはテスト用です。

答えて

0

これは私のローカルの結果です。似たようなことをしていますか?

val data = List(
     List(47.5335D), 
     List(67.5335D), 
     List(69.5335D), 
     List(444.1235D), 
     List(677.5335D) 
    ) 

val df = data.flatten.toDF 

df.stat.approxQuantile("value", Array(0.5), 0) 
// res18: Array[Double] = Array(67.5335) 
+0

Hmm、strange。別のバージョンだが、まだ69.5335ではない。私は私の質問にすべてのソースを追加しました。 – user2975535

1

この近似変位値演算であることに留意されたいです。いつも正確な答えをあなたに与えるはずがありません。より完全な説明については、hereを参照してください。

非常に大きなデータセットの場合、正確な計算よりもはるかに高速である限り、おおよその解答でOKであることがあります。

+4

しかし、ドキュメントのhttps://spark.apache.org/docs/2.0.2/api/java/org/apache/spark/sql/DataFrameStatFunctions.html#approxQuantile(java.lang.String、%20double []、 %20double)states ** relativeError - 達成する相対ターゲット精度(> = 0)。ゼロに設定すると正確な分位数が計算されます** – user2975535

+0

あなたはこの問題を指摘したいかもしれません。 – Amir

関連する問題