Spark执行orderBy后调用collect(),返回的Scala列表是否保序?
Spark DataFrame执行orderBy后collect()返回的Scala列表是否保留排序顺序?
是的,collect()返回的Scala集合会严格保留orderBy定义的全局排序顺序。
原因说明:
Spark的orderBy(或sort)操作是全局排序,并非仅在各Executor上做局部排序:
- 首先会在每个Executor上对本地数据做局部排序;
- 随后通过Shuffle机制,将排序后的数据按分区键重新分发,确保同一排序区间的数据汇聚到同一节点;
- 最终在Driver端完成全局有序的合并。
当调用collect()时,Spark会把这个已经全局有序的完整数据集拉取到Driver端,直接封装成有序的Scala集合(你的代码中返回的是Array[Row],Scala的Array本身是有序结构),自然会保留排序后的顺序。
结合你的代码验证:
你的代码中通过orderBy(col("users").desc)指定按用户量降序排列,执行collect()后,collectedDataList的元素顺序必然是:
Row("Python", 100000), Row("Java", 20000), Row("Scala", 3000)
完全符合你定义的排序规则,不会因为分布式执行的特性打乱顺序。
内容的提问来源于stack exchange,提问作者Yogesh Patel
相关产品推荐
相关产品推荐

