窗口上的 Spark 计算方差

Posted

技术标签:

【中文标题】窗口上的 Spark 计算方差【英文标题】:Spark computing variance over a window 【发布时间】:2021-01-04 10:30:14 【问题描述】:

我有一个结构如下的数据框:

+------------------+
|   id  |     value|
+------------------+
|  user0|     100  |
|  user1|     102  |
|  user0|     109  |
|  user2|     103  |
|  user1|     108  |
|  user0|     119  |
|  user0|     140  |
|  user0|     142  |
+------------------+

我想计算每个 ID 的每一行和前面的差异,为此我尝试了以下代码:

import pyspark.sql.functions as F

w_vv = Window.partitionBy('id')  
df=df.withColumn('variances',F.round(F.var_pop("value"),2).over(w_vv.rowsBetween(Window.unboundedPreceding,0)))

这是理想的期望输出

+--------------------------------------------------------------+
|   User|  value|                                     variances|
+--------------------------------------------------------------+
|  user0| value1|         -                                    |
|  user1| value1|         -                                    |
|  user0| value2|  variance(value2,value1)                     |
|  user1| value2|  variance(value2,value1)                     |
|  user1| value3|  variance(value3,value2,value1)              |
|  user0| value3|  variance(value4,value3,value2,value1)       |
|  user0| value4|  variance(value4,value3,value2,value1)       |
|  user0| value5|  variance(value5,value4,value3,value2,value1)|
+--------------------------------------------------------------+

前面的输出以数字为例:

+---------------------------+
|   User|  value|  variances|
+---------------------------+
|  user0| 2|         -      |
|  user1| 4|         -      |
|  user0| 3| 0.25           |
|  user1| 3| 0.25           |
|  user1| 9| 6.9            |
|  user0| 7| 4.7            |
|  user0| 3| 3.7            |     
|  user0| 4| 3              |
+---------------------------+

但是代码返回以下错误

grouping expressions sequence is empty, and '`timestamp`' is not an aggregate function.  
Wrap '(var_pop(CAST(`value` AS DOUBLE)) AS `_w0`)' in windowing function(s) or wrap  
'`timestamp`' in first() (or first_value) if you don't care which value you get.;;

我知道应该在 groupBy 上使用聚合函数,但我不知道如何对其进行编码以使其工作,有什么想法吗?谢谢

【问题讨论】:

你能添加数字结果期望吗? @thebluephantom 确定,完成。 【参考方案1】:

您应该将窗口附加到var_pop,而不是round

w_vv = Window.partitionBy('id')  

df = df.withColumn('variances',
    F.round(
        F.var_pop("value")
         .over(w_vv.rowsBetween(Window.unboundedPreceding,0)
    , 2)
)

【讨论】:

以上是关于窗口上的 Spark 计算方差的主要内容,如果未能解决你的问题,请参考以下文章

计算滚动窗口协方差矩阵

Apache Spark - 处理临时 RDD 上的滑动窗口

Spark SQL 滑动窗口差分计算

如何在 python 中简单地计算时间序列的滚动/移动方差?

从窗口服务器 2008 上的 spark shell 命令调用 spark 时出错

如何简单地计算python中时间序列的滚动/移动方差?