Spark中的sort和orderBy函数有什么区别
What is the difference between sort and orderBy functions in Spark
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
OrderBy 只是排序函数的别名。
来自 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 : _*)
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|
+---+------+
它维护了数据的整体顺序。
它们不同 相同。
SORT BY 子句用于 return 结果行在每个分区内按用户指定的顺序排序。当有多个分区时,SORT BY 可能 return 结果是部分排序的。
参考:https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-sortby.html
ORDER BY 子句用于 return 结果行以用户指定的顺序排序。与 SORT BY 子句不同,此子句保证输出中的总顺序。
参考:https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-orderby.html
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
OrderBy 只是排序函数的别名。
来自 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 : _*)
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|
+---+------+
它维护了数据的整体顺序。
它们不同 相同。
SORT BY 子句用于 return 结果行在每个分区内按用户指定的顺序排序。当有多个分区时,SORT BY 可能 return 结果是部分排序的。
参考:https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-sortby.html
ORDER BY 子句用于 return 结果行以用户指定的顺序排序。与 SORT BY 子句不同,此子句保证输出中的总顺序。
参考:https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-orderby.html