如何获取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
相关产品推荐
相关产品推荐

