获取pyspark窗口上的最大值

Dyl*_*lan 6 apache-spark apache-spark-sql 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)
Run Code Online (Sandbox Code Playgroud)

输出是:

在此输入图像描述

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

有人对这个问题有想法吗?多谢!

Dav*_*rba 11

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

w2 = Window.partitionBy('grp')
Run Code Online (Sandbox Code Playgroud)

您可以在 PySpark文档中看到:

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