Python PySpark-添加按用户排名的新列
我有这个Pypark数据框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
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”]))