Spark中sort和orderBy函数有什么区别

时间:2016-11-15 06:13:47

标签: apache-spark spark-dataframe

sort和orderBy spark DataFrame有什么区别?

scala> zips.printSchema
root
 |-- _id: string (nullable = true)
 |-- city: string (nullable = true)
 |-- loc: array (nullable = true)
 |    |-- element: double (containsNull = true)
 |-- pop: long (nullable = true)
 |-- state: string (nullable = true)

以下命令产生相同的结果:

zips.sort(desc("pop")).show
zips.orderBy(desc("pop")).show

3 个答案:

答案 0 :(得分:20)

OrderBy只是sort函数的别名。

来自Spark文档:

  /**
   * Returns a new Dataset sorted by the given expressions.
   * This is an alias of the `sort` function.
   *
   * @group typedrel
   * @since 2.0.0
   */
  @scala.annotation.varargs
  def orderBy(sortCol: String, sortCols: String*): Dataset[T] = sort(sortCol, sortCols : _*)

答案 1 :(得分:3)

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|
+---+------+

请参阅,顺序不符合预期。现在,如果我们看到orederBy操作:

>>> tupleDF.orderBy("id").show()
+---+------+
| Id|Salary|
+---+------+
| 10|  3000|
| 11|  4000|
| 13|  2600|
| 14|  2500|
| 16|  5000|
| 17|  3100|
| 19|  1800|
| 20|  2000|
+---+------+

它维护数据的整体顺序。

答案 2 :(得分:2)

他们不是 相同

SORT BY 子句用于返回按用户指定顺序在每个分区内排序的结果行。如果分区不止一个,那么SORT BY可能会返回部分排序的结果。

参考:https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-sortby.html

ORDER BY 子句用于按用户指定的顺序以排序方式返回结果行。与SORT BY子句不同,此子句可保证输出的总顺序。

参考:https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-orderby.html