【问题标题】:Assign Rank to Row based on Alphabetical Order Using Window Functions in PySpark在 PySpark 中使用窗口函数根据字母顺序为行分配排名
【发布时间】:2021-04-24 02:40:40
【问题描述】:

我正在尝试使用基于字母顺序的字符串列 (user_id) 上的窗口函数为数据帧的行分配排名。所以,例如:

user_id | rank_num
-------------------
A       |1
A       |1
A       |1
B       |2
A       |1
B       |2
C       |3
B       |2
B       |2
C       |3

我尝试使用以下代码行:

user_window = Window().partitionBy('user_id').orderBy('user_id')
data = (data
       .withColumn('profile_row_num', dense_rank().over(user_window))
)

但我得到了类似的东西:

user_id | rank_num
-------------------
A       |1
A       |1
A       |1
B       |1
A       |1
B       |1
C       |1
B       |1
B       |1
C       |1

【问题讨论】:

  • @blackbishop 问题在下面得到解决,正是因为在代码中添加了 partitionBy 方法的错误。

标签: sql apache-spark pyspark apache-spark-sql window-functions


【解决方案1】:

user_id 的分区是不必要的。这将导致所有 user_id 落入自己的分区并获得 1 的排名。下面的代码应该可以满足您的要求:

user_window = Window.orderBy('user_id')
data = data.withColumn('profile_row_num', dense_rank().over(user_window))

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多