PySpark连接两个DataFrame后变为无序,如何获取排序后的连接结果
问题原因
- Spark的
join操作属于shuffle类算子,执行过程会重新分发各节点数据,因此striker_details表提前做好的排序会被打乱,这是分布式计算的正常特性,无法默认保留join前的排序。
解决方案
在join操作完成后,显式调用orderBy方法按照striker_grade字段排序即可。如果你需要和原striker_details一致的从高分到低分的排序,使用降序规则即可:
# 内连接后按striker_grade降序排列 ss = striker_details.join(players, ["player_api_id"], "inner") \ .orderBy("striker_grade", ascending=False)
补充说明
如果你的数据量极大,担心全局排序性能开销过高,也可以提前对striker_details按照striker_grade做范围分区后再执行join,能一定程度上降低排序开销,但普通场景下直接join后排序的写法最简单、兼容性最好。
内容的提问来源于stack exchange,提问作者Shivam Chand
相关产品推荐
相关产品推荐

