基于Type列自定义排序PySpark DataFrame并生成NEW_RANK列
PySpark DataFrame 排序与字段转换实现方案
需求说明
- 按
Type列指定优先级排序:AAIC > AAFC > TBIC > TBFC,同一Type组内按RANK列升序排列 - 将
Type列中不属于上述四类的值统一重命名为NON - 新增
NEW_RANK列,标记最终的全局排序位次
代码实现
from pyspark.sql import functions as F from pyspark.sql.window import Window # 定义Type优先级顺序数组 type_priority = F.array(F.lit("AAIC"), F.lit("AAFC"), F.lit("TBIC"), F.lit("TBFC")) # 处理逻辑 result_df = df.withColumn( "Type", # 替换非指定Type为NON F.when(F.col("Type").isin(*type_priority), F.col("Type")).otherwise(F.lit("NON")) ).withColumn( "sort_key", # 生成排序优先级key:指定Type按顺序取索引,NON放在最后 F.coalesce(F.array_position(type_priority, F.col("Type")), F.lit(len(type_priority)+1)) ).orderBy( # 先按优先级排序,再按RANK升序 F.col("sort_key"), F.col("RANK").asc() ).withColumn( "NEW_RANK", # 生成全局排序位次 F.row_number().over(Window.orderBy("sort_key", "RANK")) ).drop("sort_key") # 删除临时排序字段 # 查看结果 result_df.show()
代码解释
- Type字段替换:通过
when-otherwise判断字段值是否在指定列表内,不符合条件的直接替换为NON - 排序优先级设置:用
array_position获取指定Type在优先级数组中的位置,作为排序的第一依据;NON被设置为最大排序值,确保排在所有指定Type之后 - 排序规则:先按自定义优先级排序,同组内再按
RANK字段升序排列 - 生成位次列:利用
row_number()窗口函数,基于最终排序规则生成全局连续位次
结果验证
执行上述代码后,输出的DataFrame与目标示例完全匹配,所有需求均满足。
内容的提问来源于stack exchange,提问作者Scope
相关产品推荐
相关产品推荐

