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|
+-------+-------+
我想根据以下条件为记录分配等级:
+-------+-------+------+
| 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是记录数。还有其他方法可以实现更好的时间复杂度吗?