如何在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|
#+-----------+----------+----+
我有一个示例数据框如下:
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|
#+-----------+----------+----+