在 pyspark 中获取超过 window 的最大值
Get the max value over the window in pyspark
我在 pyspark 中获得了特定 window 的最大值。但是从该方法中 return 得到的结果并不是预期的。
这是我的代码:
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”组都会 return 2,但事实并非如此。
有人对这个问题有想法吗?非常感谢!
这里的问题出在 max
函数的框架上。如果您按顺序订购 window,框架将是 Window.unboundedPreceding, Window.currentRow
。所以你可以定义另一个 window 在那里你放下订单(因为 max 函数不需要它):
w2 = Window.partitionBy('grp')
你可以在 PySpark 中看到 docs:
Note When ordering is not defined, an unbounded window frame (rowFrame, unboundedPreceding, unboundedFollowing) is used by default. When ordering is defined, a growing window frame (rangeFrame, unboundedPreceding, currentRow) is used by default.
我在 pyspark 中获得了特定 window 的最大值。但是从该方法中 return 得到的结果并不是预期的。
这是我的代码:
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”组都会 return 2,但事实并非如此。
有人对这个问题有想法吗?非常感谢!
这里的问题出在 max
函数的框架上。如果您按顺序订购 window,框架将是 Window.unboundedPreceding, Window.currentRow
。所以你可以定义另一个 window 在那里你放下订单(因为 max 函数不需要它):
w2 = Window.partitionBy('grp')
你可以在 PySpark 中看到 docs:
Note When ordering is not defined, an unbounded window frame (rowFrame, unboundedPreceding, unboundedFollowing) is used by default. When ordering is defined, a growing window frame (rangeFrame, unboundedPreceding, currentRow) is used by default.