如何在pyspark中对列增量顺序的重复值进行排名

How to rank duplicate values of a column incremental order in pyspark

我有一个示例数据框如下:

customer id|trigger_id
=======================
1          |1101
2          |1102
3          |1101
4          |1102

现在想要按递增顺序对触发器的每个重复值进行排名,如

customer id|trigger_id|rank
===========================
1          |1101      |1
2          |1102      |1
3          |1101      |2
4          |1102      |2

之后有两个不同的数据框,一个全是偶数排名记录,另一个全是奇数排名记录。

抱歉格式错误。

提前致谢。

使用window rank()函数。

Example:

df.show()
#+-----------+----------+
#|customer_id|trigger_id|
#+-----------+----------+
#|          1|      1101|
#|          2|      1102|
#|          3|      1101|
#|          4|      1102|
#+-----------+----------+
from pyspark.sql.functions import *
from pyspark.sql import *
w=Window.partitionBy("trigger_id").orderBy("customer_id")

#using dense_rank()
df.withColumn("rank",rank().over(w)).show()
#+-----------+----------+----+
#|customer_id|trigger_id|rank|
#+-----------+----------+----+
#|          2|      1102|   1|
#|          4|      1102|   2|
#|          1|      1101|   1|
#|          3|      1101|   2|
#+-----------+----------+----+

对于唯一值使用 row_number():

df.withColumn("rank",row_number().over(w)).orderBy("customer_id").show()
df.withColumn("rank",dense_rank().over(w)).orderBy("customer_id").show()
#+-----------+----------+----+
#|customer_id|trigger_id|rank|
#+-----------+----------+----+
#|          1|      1101|   1|
#|          2|      1102|   1|
#|          3|      1101|   2|
#|          4|      1102|   2|
#+-----------+----------+----+