如何在Pyspark的DataFrame中筛选出值最大的对应条目
PySpark 筛选DataFrame指定列最大值对应条目的实现方案
我们需要从PySpark DataFrame中筛选出数值列最大值对应的完整条目,参考示例数据如下:
| Identifiant | Val |
|---|---|
| MAC26 | 36 |
| MAC10 | 9 |
| MAC02 | 2 |
| MAC32 | 11 |
| MAC09 | 37 |
| MAC28 | 10 |
我们需要最终得到Val列最大值37对应的MAC09条目,以下是两种常用实现方式:
方法1:先取最大值再过滤
逻辑简单直观,适合小体量数据集:
- 先计算Val列的全局最大值
- 用最大值作为过滤条件筛选对应行
from pyspark.sql import functions as F # 计算Val列最大值 max_value = df.select(F.max("Val")).first()[0] # 过滤得到最大值对应的条目 result_df = df.filter(F.col("Val") == max_value) # 输出结果 result_df.show()
输出结果:
+-----------+---+ |Identifiant|Val| +-----------+---+ | MAC09| 37| +-----------+---+
方法2:窗口函数排序取值
适合大体量数据集,仅需扫描一次数据,同时支持多最大值的匹配场景:
- 定义窗口按Val列降序排序
- 给每行数据计算排名
- 筛选排名为1的行即为最大值对应条目
from pyspark.sql import functions as F from pyspark.sql.window import Window # 定义排序窗口 window = Window.orderBy(F.col("Val").desc()) # 新增排名列 df_with_rank = df.withColumn("val_rank", F.rank().over(window)) # 筛选排名第一的条目,删除辅助排名列 result_df = df_with_rank.filter(F.col("val_rank") == 1).drop("val_rank") # 输出结果 result_df.show()
如果确认仅存在一个最大值,可以将F.rank()替换为F.row_number()执行效率更高。
内容的提问来源于stack exchange,提问作者elokema
相关产品推荐
相关产品推荐

