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
相关产品推荐
相关产品推荐

