Sql 根据groupBy的结果选择pyspark数据帧行

Sql 根据groupBy的结果选择pyspark数据帧行,sql,pyspark,Sql,Pyspark,我有一个三列的数据框 ID | rank | score 1 | 1 | 20 1 | 2 | 30 2 | 4 | 50 2 | 6 | 100 我想选择排名最高的行的唯一ID: ID | rank | score 1 | 2 | 30 2 | 6 | 100 我用一个groupBy尝试了这种方法,但是只要包含了score列,它在每一行中都是不同的,那么我只返回初始数据帧,并且基于排名的分组丢失了(显然) 这是我试过的 data_groupe

我有一个三列的数据框

ID | rank | score
1  | 1    | 20
1  | 2    | 30
2  | 4    | 50
2  | 6    | 100
我想选择排名最高的行的唯一ID:

ID | rank | score
1  | 2    | 30
2  | 6    | 100
我用一个groupBy尝试了这种方法,但是只要包含了score列,它在每一行中都是不同的,那么我只返回初始数据帧,并且基于排名的分组丢失了(显然)

这是我试过的

data_grouped = data.groupBy("ID", "score")
data_grouped .agg({"rank":"max"}).orderBy("ID").show()

我觉得这应该相对容易实现,但我缺乏sql/pyspark知识。

使用
窗口
将比使用groupBy更加高效和可扩展。您可以使用
max
函数和带有分区ID的
窗口来计算每个ID分组中的秩的最大值,然后在
rank
上进行
filter
并计算
maxrank

w= Window().partitionBy("ID")
df.withColumn("maxrank", F.max("rank").over(w)).filter("rank=maxrank").drop("maxrank").show()

+---+----+-----+
| ID|rank|score|
+---+----+-----+
|  1|   2|   30|
|  2|   6|  100|
+---+----+-----+

使用
窗口
将比使用groupBy更加高效和可扩展。您可以使用
max
函数和带有分区ID的
窗口来计算每个ID分组中的秩的最大值,然后在
rank
上进行
filter
并计算
maxrank

w= Window().partitionBy("ID")
df.withColumn("maxrank", F.max("rank").over(w)).filter("rank=maxrank").drop("maxrank").show()

+---+----+-----+
| ID|rank|score|
+---+----+-----+
|  1|   2|   30|
|  2|   6|  100|
+---+----+-----+

您可能需要使用
partitionBy()
方法:

我相信它的功能类似于SQL的
分区:


您可能需要使用
partitionBy()
方法:

我相信它的功能类似于SQL的
分区: