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

Python PySpark-添加按用户排名的新列,python,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,我有这个Pypark数据框 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) 用户电影分级 aa@g

我有这个Pypark数据框

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)
用户电影分级
aa@gmail.com     2      3
aa@gmail.com     5      5
bb@gmail.com     8      2
cc@gmail.com     9      3
我需要添加一个按用户排名的新列

我想要这个输出

用户电影分级等级
aa@gmail.com     2      3     1
aa@gmail.com     5      5     1
bb@gmail.com     8      2     2
cc@gmail.com     9      3     3

我怎样才能做到这一点呢?

到目前为止,这里还没有一个完美的解决方案。如果有必要,您可以尝试以下方法:

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))

但它效率极低,在实践中应避免使用

,因此这里的目标是根据
用户
顺序添加连续整数?是的,它是@zero323是的,这是一个很大的解决方案,但很有效。。您可以使用rulez;)@zero323,谢谢。有没有关于为什么在实践中应该避免使用窗口函数的参考?@Oleksiy经验法则->否
partitionBy
子句或分区键的低基数。我还没有检查master(2.0.0+)上最近的更改是如何影响这一点的,但我很确定不会有太多。@zero323-谢谢您的回答。你能解释一下为什么它效率低下,以及下面三行的作用是什么:.zipWithIndex().map(lambda x:x[0]+(x[1],).toDF([“user”,“rank”]))