Spark窗口函数过滤不符合要求的行

Posted

技术标签:

【中文标题】Spark窗口函数过滤不符合要求的行【英文标题】:Spark window function filtering rows which doesn't match requirement 【发布时间】:2021-02-22 13:53:40 【问题描述】:

我想要做的是获得两行窗口的最大值。并删除最后一行,因为它只计算一行。

例如,下面是源数据

seconds value
225 1.5
245 0.5
300 2.4
319 1.2
320 4.6

下表就是我想要的。它下降了 320 秒,因为它是最新的并且只有它自己的。

seconds max
225 1.5
245 2.4
300 2.4
319 4.6

【问题讨论】:

【参考方案1】:

您可以根据秒数降序分配行号,并使用过滤器删除最后一行:

from pyspark.sql import functions as F, Window

df2 = df.withColumn(
    'max',
    F.max('value').over(Window.orderBy('seconds').rowsBetween(0, 1))
).withColumn(
    'rn',
    F.row_number().over(Window.orderBy(F.desc('seconds')))
).filter('rn != 1').drop('rn', 'value')

df2.show()
+-------+---+
|seconds|max|
+-------+---+
|    319|4.6|
|    300|2.4|
|    245|2.4|
|    225|1.5|
+-------+---+

【讨论】:

以上是关于Spark窗口函数过滤不符合要求的行的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL/Spark 中使用窗口函数执行特定过滤器

Apache Spark 中窗口函数中的过滤器和条件

Spark SQL 中分组依据和窗口函数如何交互?

PySpark 中的窗口函数和条件过滤器

为啥将 ROW_NUMBER 定义为窗口函数?

如何使用窗口函数仅在 POSTGRES 中选择不超过某个值的行