Pyspark 为什么Pypark给出了错误的方差值?

Pyspark 为什么Pypark给出了错误的方差值?,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我在pyspark有一张登记表 +--------+-------+--------+------------+---------+-----------------+----------------------+ |order_id|user_id|eval_set|order_number|order_dow|order_hour_of_day|days_since_prior_order| +--------+-------+--------+------------+---------+

我在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|
+--------+-------+--------+------------+---------+-----------------+----------------------+
我想计算自上次订单以来的
天数的方差,不包括空值。正确的值应该是97.91836734693878,这是由hive和python给出的。但我的Pypark给我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)

尝试使用以下函数代替pyspark.sql.functions.variance(col):

pyspark.sql.functions.var_pop(col)

聚合函数:返回组中值的总体方差

使用您的列数据,var_pop为我提供了以下结果:

[Row(var_pop(days_since_prior_order)=97.91836734693877)]
原因是:

  • variance()var_samp()按1/(N-1)缩放
  • var_pop()按1/N缩放
选择N个值

有关有用的链接,请参阅


您将发现var_pop()的文档尝试使用以下函数而不是pyspark.sql.functions.variance(col):

pyspark.sql.functions.var_pop(col)

聚合函数:返回组中值的总体方差

使用您的列数据,var_pop为我提供了以下结果:

[Row(var_pop(days_since_prior_order)=97.91836734693877)]
原因是:

  • variance()var_samp()按1/(N-1)缩放
  • var_pop()按1/N缩放
选择N个值

有关有用的链接,请参阅


您将找到var_pop()

的文档。您如何计算spark中的方差,能否提供代码??您如何计算spark中的方差,能否提供代码??