sort()
函数按照文件系统上给定列对每个存储桶中的输出进行排序。它不保证输出数据的顺序。
而 orderBy()
分两个阶段进行。
首先在每个存储桶内使用 sortBy()
进行排序,然后整个数据必须被带入单个执行器以根据指定列以升序或降序的方式获得总体顺序。这涉及大量的洗牌操作,是一项代价高昂的操作。但是由于
sort()
操作发生在每个单独的存储桶内并且是一项轻量级操作。
这里有一个例子:
准备数据
>>> listOfTuples = [(16,5000),(10,3000),(13,2600),(19,1800),(11,4000),(17,3100),(14,2500),(20,2000)]
>>> tupleRDD = sc.parallelize(listOfTuples,2)
>>> tupleDF = tupleRDD.toDF(["Id","Salary"])
数据看起来像这样:
>>> tupleRDD.glom().collect()
[[(16, 5000), (10, 3000), (13, 2600), (19, 1800)], [(11, 4000), (17, 3100), (14, 2500), (20, 2000)]]
>>> tupleDF.show()
+
| Id|Salary|
+
| 16| 5000|
| 10| 3000|
| 13| 2600|
| 19| 1800|
| 11| 4000|
| 17| 3100|
| 14| 2500|
| 20| 2000|
+
现在将进行排序操作。
>>> tupleDF.sort("id").show()
+---+------+
| Id|Salary|
+---+------+
| 10| 3000|
| 11| 4000|
| 13| 2600|
| 14| 2500|
| 16| 5000|
| 17| 3100|
| 19| 1800|
| 20| 2000|
+---+------+
看,顺序不如预期。现在如果我们看orderBy操作:
>>> tupleDF.orderBy("id").show()
+---+------+
| Id|Salary|
+---+------+
| 10| 3000|
| 11| 4000|
| 13| 2600|
| 14| 2500|
| 16| 5000|
| 17| 3100|
| 19| 1800|
| 20| 2000|
+---+------+
它保持数据的整体顺序。