2017-05-23 4 views
0

私はpysparkに登録されたテーブルを持っています。なぜpysparkは分散の値が間違っていますか?

+--------+-------+--------+------------+---------+-----------------+----------------------+ 
|order_id|user_id|eval_set|order_number|order_dow|order_hour_of_day|days_since_prior_order| 
+--------+-------+--------+------------+---------+-----------------+----------------------+ 
| 2168274|  2| prior|   1|  2|    11|     null| 
| 1501582|  2| prior|   2|  5|    10|     10| 
| 1901567|  2| prior|   3|  1|    10|      3| 
| 738281|  2| prior|   4|  2|    10|      8| 
| 1673511|  2| prior|   5|  3|    11|      8| 
| 1199898|  2| prior|   6|  2|    9|     13| 
| 3194192|  2| prior|   7|  2|    12|     14| 
| 788338|  2| prior|   8|  1|    15|     27| 
| 1718559|  2| prior|   9|  2|    9|      8| 
| 1447487|  2| prior|   10|  1|    11|      6| 
| 1402090|  2| prior|   11|  1|    10|     30| 
| 3186735|  2| prior|   12|  1|    9|     28| 
| 3268552|  2| prior|   13|  4|    11|     30| 
| 839880|  2| prior|   14|  3|    10|     13| 
| 1492625|  2| train|   15|  1|    11|     30| 
+--------+-------+--------+------------+---------+-----------------+----------------------+ 

null値を除いて、days_since_prior_orderの分散を計算したいとします。適切な値は97.91836734693878で、これはハイブとPythonによって与えられます。しかし、私のpysparkは私に105.45054945054943を与える。

spark.sql("select variance(days_since_prior_order) from \ 
(select * from orders where user_id=2 and days_since_prior_order is not null) ").show() 

元のテーブルのデータ型は正しいです。

|-- order_id: long (nullable = true) 
|-- user_id: long (nullable = true) 
|-- eval_set: string (nullable = true) 
|-- order_number: short (nullable = true) 
|-- order_dow: short (nullable = true) 
|-- order_hour_of_day: short (nullable = true) 
|-- days_since_prior_order: short (nullable = true) 
+0

どのようにあなたが火花で分散を計算している、あなたは、コードを提供してくださいすることができます。 ?? –

答えて

1

代わりpyspark.sql.functions.variance(COL)次の関数を使用してみてください:

pyspark.sql.functions.var_pop(COL)

集計関数:グループ内の値の母集団分散を返します。あなたの列のデータで

、VAR_POPは私にこの結果を与える:

  • 分散()VAR_SAMP()が1によってスケーリングされています

    [Row(var_pop(days_since_prior_order)=97.91836734693877)] 
    

    理由はあります/(N-1)

  • var_pop()は、1/N

N個の値が選択されています。

有用なリンクについては、population and sample varianceを参照してください。

HereあなたがVAR_POPのドキュメントを検索します()

関連する問題