如何根据某些条件为 spark 数据框中的记录分配等级?

How to assign ranks to records in a spark dataframe based on some conditions?

给定一个数据框:

+-------+-------+
|   A   |   B   |
+-------+-------+
|      a|      1|
+-------+-------+
|      b|      2|
+-------+-------+
|      c|      5|
+-------+-------+
|      d|      7|
+-------+-------+
|      e|     11|
+-------+-------+    

我想根据条件为记录分配排名:

  1. 排名从 1 开始
  2. 如果(当前记录的 B - 先前记录的 B)<= 2,则分配排名 = 先前记录的排名
  3. 当(当前记录的 B - 先前记录的 B)> 2 时递增排名

所以我希望结果是这样的:

+-------+-------+------+
|   A   |   B   | rank |
+-------+-------+------+
|      a|      1|     1|
+-------+-------+------+
|      b|      2|     1|
+-------+-------+------+
|      c|      5|     2|
+-------+-------+------+
|      d|      7|     2|
+-------+-------+------+
|      e|     11|     3|
+-------+-------+------+

还有其他方法可以达到同样的效果吗? 我想知道一个时间复杂度为 O(n) 的解决方案,n 是记录数。

一个 SQL 的解决方案是

select a,b,1+sum(col) over(order by a) as rnk
from 
(
select t.*
,case when b - lag(b,1,b) over(order by a) <= 2 then 0 else 1 end as col
from t
) x

解决方案假定排序基于列 a

SQL Server example