Python 如何根据某些条件为spark数据帧中的记录分配列组?

Python 如何根据某些条件为spark数据帧中的记录分配列组?,python,sql,dataframe,pyspark,rank,Python,Sql,Dataframe,Pyspark,Rank,给定一个数据帧: +-------+-------+ | A | B | +-------+-------+ | a| 1| +-------+-------+ | b| 2| +-------+-------+ | c| 5| +-------+-------+ | d| 7| +-------+-------+ | e| 11| +-------+-------+ 我想

给定一个数据帧:

+-------+-------+
|   A   |   B   |
+-------+-------+
|      a|      1|
+-------+-------+
|      b|      2|
+-------+-------+
|      c|      5|
+-------+-------+
|      d|      7|
+-------+-------+
|      e|     11|
+-------+-------+    
我想根据以下条件为记录分配等级:

  • 以1开始排名
  • 如果(当前记录的B-上一记录的B)为2,则分配秩=上一记录的秩
  • 所以我希望结果是这样的:

    +-------+-------+------+
    |   A   |   B   | rank |
    +-------+-------+------+
    |      a|      1|     1|
    +-------+-------+------+
    |      b|      2|     1|
    +-------+-------+------+
    |      c|      5|     2|
    +-------+-------+------+
    |      d|      7|     2|
    +-------+-------+------+
    |      e|     11|     3|
    +-------+-------+------+
    
    • spark中的内置函数,如行数、秩、稠密_秩不 提供任何功能来实现这一点
    • 我尝试通过使用全局变量rank和fetching来实现这一点 以前使用滞后函数记录的值,但未给出 与sql不同,spark中的分布式处理导致结果一致
    • 我尝试的另一种方法是将记录的滞后值传递给UDF,同时生成一个新列并在UDF中应用条件。但我面临的问题是,我可以得到A列和B列的滞后值,但不能得到列秩的滞后值。 由于无法解析列名排名,因此出现错误:

      sql(“选择df.*,LAG(df.rank,1)OVER(ORDER BY B,0)作为rank\u LAG,udfGetVisitNo(B,rank\u LAG)作为df中的rank”)

    • 我无法获取当前添加的列的滞后值

    • 此外,我不希望使用需要使用df.collect()的方法,因为此数据帧的大小相当大,在单个工作节点上收集会导致内存错误

    还有其他方法可以达到同样的效果吗?
    我想知道一个时间复杂度为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、b、1+sum(col)over(按a排序)作为rnk
    从…起
    (
    选择t*
    
    ,当b滞后(b,1,b)超过(a指令)时的情况你能像sql一样进行子查询吗?是的。如果你有基于sql的解决方案,我可以使用类似sql的查询。这很有效。谢谢。这个子查询会对我的代码的执行时间产生多大影响?我有大约7000000条记录。我不确定我能猜出它对执行时间的影响。试试看。最后的查询只是对t的值求和内部查询。好的,明白了!再次感谢。@MukulChandel子查询在这里不是问题,但在性能方面,您肯定希望避免在任何实际大小的数据集上
    超过(按a排序)
    。是的。我发现这个解决方案在O(n^2)中有效,n是记录数。还有其他方法可以实现更好的时间复杂度吗?