我在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|
+--------+-------+--------+------------+---------+-----------------+----------------------+
我想计算days_since_prior_order
的方差,不包括空值。正确的值应该是97.91836734693878,由hive和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 :(得分:2)
尝试使用以下函数代替 pyspark.sql.functions.variance(col):
pyspark.sql.functions.var_pop(COL)
聚合函数:返回组中值的总体方差。
使用您的列数据,var_pop给出了这个结果:
[Row(var_pop(days_since_prior_order)=97.91836734693877)]
原因是:
选择了N个值。
请参阅population and sample variance以获取有用的链接。
Here你会找到 var_pop()
的文档