首页 > 解决方案 > 在pyspark中获取窗口上的最大值

问题描述

我在 pyspark 中的特定窗口上获得最大值。但是从该方法返回的不是预期的。

这是我的代码:

test = spark.createDataFrame(DataFrame({'grp': ['a', 'a', 'b', 'b'], 'val': [2, 3, 3, 4]}))
win = Window.partitionBy('grp').orderBy('val')
test = test.withColumn('row_number', F.row_number().over(win))
test = test.withColumn('max_row_number', F.max('row_number').over(win))
display(test)

输出是:

在此处输入图像描述

我预计它会为“a”组和“b”组返回 2,但事实并非如此。

有人对这个问题有想法吗?非常感谢!

标签: apache-sparkpysparkapache-spark-sqlpyspark-dataframes

解决方案


这里的问题在于函数的框架max。如果您在做框架时订购窗口Window.unboundedPreceding, Window.currentRow。因此,您可以定义另一个窗口来放置订单(因为 max 函数不需要它):

w2 = Window.partitionBy('grp')

您可以在 PySpark文档中看到:

注意 未定义 ordering 时,默认使用无界窗口框架(rowFrame、unboundedPreceding、unboundedFollowing)。定义排序时,默认使用增长的窗口框架(rangeFrame、unboundedPreceding、currentRow)。


推荐阅读