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)。