KAs*_*KAs 36 python dataframe apache-spark apache-spark-sql pyspark
pyspark中有一个DataFrame,数据如下:
user_id object_id score
user_1 object_1 3
user_1 object_1 1
user_1 object_2 2
user_2 object_1 5
user_2 object_2 2
user_2 object_2 6
Run Code Online (Sandbox Code Playgroud)
我期望在每个组中返回具有相同user_id的2条记录,这些记录需要具有最高分.因此,结果应如下所示:
user_id object_id score
user_1 object_1 3
user_1 object_2 2
user_2 object_2 6
user_2 object_1 5
Run Code Online (Sandbox Code Playgroud)
我是pyspark的新手,有人能给我一个代码片段或门户网站来解决这个问题的相关文档吗?十分感谢!
mto*_*oto 54
我相信你需要使用窗口函数来获得基于user_id和的每一行的等级score,然后过滤你的结果只保留前两个值.
from pyspark.sql.window import Window
from pyspark.sql.functions import rank, col
window = Window.partitionBy(df['user_id']).orderBy(df['score'].desc())
df.select('*', rank().over(window).alias('rank'))
.filter(col('rank') <= 2)
.show()
#+-------+---------+-----+----+
#|user_id|object_id|score|rank|
#+-------+---------+-----+----+
#| user_1| object_1| 3| 1|
#| user_1| object_2| 2| 2|
#| user_2| object_2| 6| 1|
#| user_2| object_1| 5| 2|
#+-------+---------+-----+----+
Run Code Online (Sandbox Code Playgroud)
一般来说,官方编程指南是开始学习Spark的好地方.
rdd = sc.parallelize([("user_1", "object_1", 3),
("user_1", "object_2", 2),
("user_2", "object_1", 5),
("user_2", "object_2", 2),
("user_2", "object_2", 6)])
df = sqlContext.createDataFrame(rdd, ["user_id", "object_id", "score"])
Run Code Online (Sandbox Code Playgroud)
Mar*_*app 19
如果使用Top-n row_number而不是rank在获得等级相等时更准确:
val n = 5
df.select(col('*'), row_number().over(window).alias('row_number')) \
.where(col('row_number') <= n) \
.limit(20) \
.toPandas()
Run Code Online (Sandbox Code Playgroud)
注意
limit(20).toPandas()技巧而不是show()Jupyter笔记本更好的格式化.
| 归档时间: |
|
| 查看次数: |
35455 次 |
| 最近记录: |