首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理排名中的关系: Pyspark

处理排名中的关系: Pyspark
EN

Stack Overflow用户
提问于 2021-05-11 17:05:55
回答 1查看 79关注 0票数 1

我有一个下面这样的数据框架。

代码语言:javascript
复制
+---+-------+-------+
|ayy| artist|numbers|
+---+-------+-------+
|  a|  Monet|  10000|
|  a|   Dali|  10000|
|  a|Gauguin|  10000|
|  b|  Monet|  10000|
|  b|   Dali|  10000|
|  b|Gauguin|  10000|
+---+-------+-------+

我想根据他们的“数字”选择一个“艺术家”,但我想确保当“数字”之间有联系时,我会随机选择。

我实现了下面的代码。

代码语言:javascript
复制
w = Window.partitionBy('ayy').orderBy(F.col('numbers').desc())
df_test = df_test.withColumn('rank', F.rank().over(w))\
                .withColumn('rank2', F.row_number().over(w))
df_test.show()

这给了我

代码语言:javascript
复制
+---+-------+-------+----+-----+
|ayy| artist|numbers|rank|rank2|
+---+-------+-------+----+-----+
|  a|  Monet|  10000|   1|    1|
|  a|Gauguin|  10000|   1|    2|
|  a|   Dali|  10000|   1|    3|
|  b|  Monet|  10000|   1|    1|
|  b|   Dali|  10000|   1|    2|
|  b|Gauguin|  10000|   1|    3|
+---+-------+-------+----+-----+

看,在这种情况下,我只能根据他们的“数字”获得一个艺术家,但我想确保我在领带的情况下随机选择一个“艺术家”。

我的第一个想法是使用udf,但我仍然不太确定该怎么做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-11 17:20:08

您可以将[0.0,1.0]范围内的随机数添加到排名中,然后根据排名分配行号:

代码语言:javascript
复制
from pyspark.sql import functions as F, Window

df2 = df.withColumn(
    'rank', 
    F.rank().over(Window.partitionBy('ayy').orderBy(F.col('numbers').desc())) 
    + F.rand(seed=1)
).withColumn(
    'rank', 
    F.row_number().over(Window.partitionBy('ayy').orderBy('rank'))
)

df2.show()
+---+-------+-------+----+
|ayy| artist|numbers|rank|
+---+-------+-------+----+
|  b|Gauguin|  10000|   1|
|  b|   Dali|  10000|   2|
|  b|  Monet|  10000|   3|
|  a|  Monet|  10000|   1|
|  a|Gauguin|  10000|   2|
|  a|   Dali|  10000|   3|
+---+-------+-------+----+
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67483709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档