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的
分区: