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

PySpark中同一列组合使用Group By与Order By的方法

PySpark中GroupBy、Pivot后按列排序的解决方法

你当前代码的问题在于:提前在SQL查询里加的order by user_state desc只会对原始查询结果排序,但后续执行groupBy和pivot时,聚合操作会重新组织数据,之前的排序会被完全打乱,所以最终结果的user_state顺序不符合预期。

要实现最终结果按user_state字母顺序排序,必须把排序操作放在所有聚合、透视步骤之后,以下是两种可行方案:

方案一:基于DataFrame API链式调用排序

直接在count()之后添加orderBy方法,指定按user_state升序(字母顺序)排列:

spark.sql("""select user_state , user_gender from users_vw where user_phone_numbers is not null""")\
    .groupBy('user_state')\
    .pivot('user_gender')\
    .count()\
    .orderBy('user_state')\  # 升序排序(默认就是字母顺序)
    .show()

如果需要降序排列,修改为.orderBy('user_state', ascending=False)即可。

方案二:全SQL语句实现(更简洁)

把筛选、聚合、透视、排序逻辑全部写在SQL中,用原生SQL的PIVOT语法:

spark.sql("""
SELECT *
FROM (
    -- 先筛选出有效数据
    SELECT user_state, user_gender 
    FROM users_vw 
    WHERE user_phone_numbers IS NOT NULL
) src
-- 透视统计各性别数量
PIVOT (
    COUNT(user_gender) 
    FOR user_gender IN ('Male' AS male_count, 'Female' AS female_count)
) pvt
-- 最后按user_state字母排序
ORDER BY user_state
""").show()

注意:SQL的PIVOT需要明确列出user_gender的所有可能取值(比如示例中的'Male'、'Female'),如果不确定所有取值,方案一的DataFramepivot方法会自动识别所有不同值,更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:22:12