order什么意思(order相关的词)

最近在工作中使用Hive比较多,阅读现有项目的代码时,经常会看到order by,cluster by等语句。之前没有仔细了解其区别,这几天在翻阅Hive的文档和数据,现在结合官方文档,简单聊聊这几个By的含义和区别。

Order By

Hive QL中ODER BY的语法和SQL中的ODER BY语法类似:对目标结果进行排序。

colOrder: ( ASC | DESC )colNullOrder: (NULLS FIRST | NULLS LAST) -- (Note: Available in Hive 2.1.0 and later)orderBy: ORDER BY colName colOrder? colNullOrder? (',' colName colOrder? colNullOrder?)*query: SELECT expression (',' expression)* FROM src orderBy

需要注意的是,Hive QL的操作实际上是Map Reduce任务,在使用ODER BY时,只能有一个reducer,这样才能对目标结果进行全局排序。如果查询语句的目标结果数量庞大,将会耗费较长的计算时间。

Sort By

Hive QL中的SORT BY的语法也和SQL中的ODER BY语法类似:对目标结果进行排序。

colOrder: ( ASC | DESC )sortBy: SORT BY colName colOrder? (',' colName colOrder?)*query: SELECT expression (',' expression)* FROM src sortBy

Hive使用SORT BY时,数据在进入reducer之前就进行了排序。如果有多个reducer时,最终结果集中的数据是局部排序的。

区别:Oder By and Sort By

Oder by确保在最终的结果集中,所有数据是按照目标排序规则进行排序的。而Sort by只能保证在单个reducer中的数据集是按照目标排序规则进行排序的,而最终的结果集则可能是局部排序的(取决于reducer的数量)。

能确认的是,在每个reducer中的数据是按照目标排序规则进行排序的。如下面的例子:

SELECT key, value FROM src SORT BY key ASC, value DESC

有两个reducer,各自的输出为:

0 50 33 69 10 40 31 12 5Cluster By and Distribute By

Cluster By和Distributed By使用在Transform/Map-Reduce Scripts中,但当需要对查询的输出进行划分和排序时,也常常会使用到。

Distributed By:按照指定的字段进行划分,输出到不同的reducer中。

Cluster By:相当于是Distributed By和Sort By的结合。

拥有相同Distributed By columns将会进入到相同的reducer中。

下面是使用Distributed By和Cluster By的例子

使用Distributed By将下列5行分配到两个reducer中。

x1x2x4x3x1

reducer 1:

x1x2x1

reducer 2:

x4x3

使用Cluster By时:

reducer 1:

x1x1x2

reducer 2:

x3x4

参考文档:https://cwiki.apache.org/confluence/display/Hive/Home

order什么意思

相关文章