You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取DataFrame中指定列最大值对应的行?求更简洁实现

获取DataFrame中p列值最大行的简洁写法

嘿,针对你这个拥有5200158行的DataFrame,我给你分享几个比你当前写法更简洁的实现方式,不管是要单条最大行还是所有最大行的情况都覆盖到啦!

首先先还原你的DataFrame示例(修正了格式,方便查看):

df.show(5)
// 输出:
+-------+------------+---------------------------+-----+
|     kv|       list1|                      list2|    p|
+-------+------------+---------------------------+-----+
|[k1,v2]|   [1,2,5,9]|[5,1,7,9,6,3,1,4,9]        | 0.5 |
|[k1,v3]|[1,2,5,8,9]|[5,1,7,9,6,3,1,4,15]       | 0.9 |
|[k2,v2]|[77,2,5,9] |[0,1,8,9,7,3,1,4,100]      |0.01 |
|[k5,v5]|   [1,0,5,9]|[5,1,7,9,6,3,1,4,3]        | 0.3 |
|[k9,v2]|   [1,2,5,9]|[5,1,7,9,6,3,1,4,200]      | 2.5 |
+-------+------------+---------------------------+-----+

df.count() // 结果:5200158

方法1:仅获取单条p值最大的行(最简洁)

如果你的场景只需要任意一条p值最大的行,这个写法最直观简洁,Spark会自动优化执行逻辑,不会做全量排序,性能很靠谱:

val maxPRow = df.orderBy(col("p").desc).limit(1)
maxPRow.show()

方法2:获取所有p值等于最大值的行(两次扫描实现)

如果存在多条行的p值都是最大值,想要全部获取的话,可以先计算最大值再过滤:

// 先获取p列的最大值
val maxPValue = df.select(max("p")).first().getDouble(0)
// 过滤出所有p等于最大值的行
val maxPRows = df.filter(col("p") === maxPValue)
maxPRows.show()

方法3:获取所有p值等于最大值的行(高效单扫描实现)

针对大表(比如你的520万行),用窗口函数只需要扫描一次DataFrame,性能更优:

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.rank

// 定义窗口:按p降序排序
val windowSpec = Window.orderBy(col("p").desc)
// 给每行打排名,过滤排名为1的行,最后删除辅助列
val maxPRows = df.withColumn("rank", rank().over(windowSpec))
                 .filter(col("rank") === 1)
                 .drop("rank")
maxPRows.show()

这些写法都比你原来的struct拼接方式简洁很多,而且逻辑清晰,维护起来也方便~

内容的提问来源于stack exchange,提问作者Chaouki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:02:32