Apache spark 过滤掉前n个值后计算平均值和标准差

Apache spark 过滤掉前n个值后计算平均值和标准差,apache-spark,pyspark,pyspark-sql,Apache Spark,Pyspark,Pyspark Sql,我有一个像这样的火花数据框 柱a |柱b |公制 ------------ a1 | b1 | 100 a1 | b2 | 1 a1 | b3 | 3 a1 | b4 | 20 a2 | b5 | 4 a2 | b6 | 80 a2 | b7 | 20 a2 | b8 | 10 a2 | b9 | 20 a2 | b10 | 5 现在,我想在过滤掉前n个值之后,计算列colua上聚合的平均值和标准偏差 例如,如果n=1,则应根据以下过滤表计算平均值和标准偏差: 柱a |柱b |公制 ------

我有一个像这样的火花数据框

柱a |柱b |公制 ------------ a1 | b1 | 100 a1 | b2 | 1 a1 | b3 | 3 a1 | b4 | 20 a2 | b5 | 4 a2 | b6 | 80 a2 | b7 | 20 a2 | b8 | 10 a2 | b9 | 20 a2 | b10 | 5 现在,我想在过滤掉前n个值之后,计算列colua上聚合的平均值和标准偏差

例如,如果n=1,则应根据以下过滤表计算平均值和标准偏差:

柱a |柱b |公制 ------------ a1 | b2 | 1 a1 | b3 | 3 a1 | b4 | 20 a2 | b5 | 4 a2 | b7 | 20 a2 | b8 | 10 a2 | b9 | 20 a2 | b10 | 5 这将导致

col|U a |平均值|标准 --------------- a1 | 8.0 | 8.5 a2 | 11.8 | 6.9 没有这个过滤,我会跑

df.groupby'col_a'。aggf.avg'metric',f.stddev'metric'
知道如何添加这样的过滤器吗?

您可以添加一个中间列用于过滤。根据您想要处理领带的方式,您可以使用或

以下示例演示了这一区别:

从pyspark.sql导入窗口 导入pyspark.sql.f函数 w=Window.partitionBycol\u a.orderByf.descmetric df=df.select *, f、 密秩,密秩,密秩, f、 行\编号.overv.aliasmetric\行 df.show +---+---+---+------+-----+ |列a |列b |度量|度量|秩|度量|行| +---+---+---+------+-----+ |a2 | b6 | 80 | 1 | 1| |a2 | b7 | 20 | 2 | 2| |a2 | b9 | 20 | 2 | 3| |a2 | b8 | 10 | 3 | 4| |a2 | b10 | 5 | 4 | 5| |a2 | b5 | 4 | 5 | 6| |a1 | b1 | 100 | 1 | 1| |a1 | b4 | 20 | 2 | 2| |a1 | b3 | 3 | 3 | 3| |a1 | b2 | 1 | 4 | 4| +---+---+---+------+-----+ 现在只需根据度量等级或度量行进行筛选,然后进行聚合。在n=1的具体示例中,没有区别:

n=1 df.wheref.colmetric_秩>n\ .groupby'col_a'\ .aggf.avg'metric',f.stddev_pop'metric'\ 显示 +---+------+---------+ |col|a | avgmetric | stddev|u popmetric| +---+------+---------+ |a2 | 11.8 | 6.997142273814361| |a1 | 8.0 | 8.524474568362947| +---+------+---------+ 注意:您使用的是返回无偏样本标准偏差的,而您显示的数字实际上是总体标准偏差,即


但是,您可以看到,如果n=2,则会出现不同的结果,具体取决于您用于过滤器的两列中的哪一列。查看a2如何有两行的度量值为20。如果要排除正好两行,则应使用metric_row。如果要删除值位于前2位的所有行,则需要使用metric_rank。

如果是平局,您会怎么做。例如,如果n=2,由于20出现两次,a2应使用哪些值?