首页 文章

PySpark - 添加一个按用户排名的新列

提问于
浏览
4

海兰

我有这个PySpark DataFrame

df = pd.DataFrame(np.array([
    ["aa@gmail.com",2,3], ["aa@gmail.com",5,5],
    ["bb@gmail.com",8,2], ["cc@gmail.com",9,3]
]), columns=['user','movie','rating'])

sparkdf = sqlContext.createDataFrame(df, samplingRatio=0.1)

         user movie rating
aa@gmail.com     2      3
aa@gmail.com     5      5
bb@gmail.com     8      2
cc@gmail.com     9      3

我需要添加一个按用户排名的新列

我想要这个输出

user  movie rating  Rank
aa@gmail.com     2      3     1
aa@gmail.com     5      5     1
bb@gmail.com     8      2     2
cc@gmail.com     9      3     3

我怎样才能做到这一点?

你的时间很多

1 回答

  • 10

    这里真的没有优雅的解决方案 . 如果必须,您可以尝试这样的事情:

    lookup = (sparkdf.select("user")
        .distinct()
        .orderBy("user")
        .rdd
        .zipWithIndex()
        .map(lambda x: x[0] + (x[1], ))
        .toDF(["user", "rank"]))
    
    sparkdf.join(lookup, ["user"]).withColumn("rank", col("rank") + 1)
    

    窗口函数替代更简洁:

    from pyspark.sql.functions import dense_rank
    
    sparkdf.withColumn("rank", dense_rank().over(w))
    

    但这是非常低效的 should be avoided in practice .

相关问题