2017-03-08 184 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

嗯,奇怪。另一個版本,但仍然不是69.5335。我已將所有來源添加到我的問題中。 – user2975535

1

注意,這是一個近似位數計算。它不應該一直給你確切的答案。有關更詳細的解釋,請參見here

原因是,對於非常大的數據集,有時只要您的計算速度明顯快於確切計算,您就可以用近似答案。

+4

但是在文檔https://spark.apache.org/docs/2.0.2/api/java/org/apache/spark/sql/DataFrameStatFunctions.html#approxQuantile(java.lang.String,%20double [], %20double)他們聲明** relativeError - 實現相對目標精度(> = 0)。如果設置爲零,則計算確切的分位數** – user2975535

+0

我明白了。你可能想在問題中指出這一點。 – Amir

相關問題