【发布时间】:2020-06-30 06:06:01
【问题描述】:
我有一个用例,我需要在滑动窗口上计算列(我们称之为 X)的百分位数。 所以窗口定义是按时间顺序排列的 - 过去 120 天:
days = lambda i: i * 86400
w = Window.partitionBy("entityId").orderBy(F.col("trn_time").cast("long").asc())
.rangeBetween(-days(120),-days(1))
我想过使用 approxQuantile 但它是一个 Dataframe 函数。 第二个选项是使用:
percent_rank().over(w)
但我需要按要在其上进行百分位数的数字列 (X) 对窗口进行排序,并且窗口已经按时间排序。 当我尝试在窗口定义中将 X 添加到 orderBY 时:
w = Window.partitionBy("entityId").orderBy(F.col("trn_time").cast("long").asc(),"X")\
.rangeBetween(-days(120),-days(1))
我收到以下错误:“不能在具有多个 order by 表达式的窗口规范中使用具有值边界的范围窗口框架”
我该如何实现这个逻辑?
【问题讨论】:
-
您可以尝试使用
row_number()的窗口函数按时间和 X 对 df 进行排序,然后在最终计算中按该行号而不是时间和 X 进行排序
标签: apache-spark pyspark apache-spark-sql