hive中的排序操作 Sort/Distribute/Cluster/Order By



Hive中常见的排序操作有
order by, sort by, distribute by, cluster by,
下面一一介绍。


1.order by

在hive中如果需要对全部数据进行排序,可以使用order by操作,此时所有的数据都会分配到同一个Reducer处理。但是如果数据量太大的话,有可能会导致一个Reducer应付不过来。

select userid, age, salary
  from database.table
 order by salary desc
 limit 100

上面代码是对表中的所有数据按照salary进行排序,然后取100个输出。

请记住:使用order by 的时候,必须在后面使用limit来限制排序后输出的数量。


2.sort by

hive中如果数据量太大的话,order by的效率非常低,而且很多时候并不需要全局排序,此时可以使用sort by,sort by为每个reducer产生一个排序文件,每个reducer内部进行排序,对全局结果来说并不是有序的。

select userid, age, salary
  from database.table
  sort by salary


3.distribute by

在一些情况下,需要将某个字段指定到特定的reducer上,需要用到distribute by,通常也是为了后续的聚集操作。distribute by通常会结合sort by使用。

select userid, age, salary
  from database.table
 distribute by age
  sort by salary
 limit 100

上面的代码中,distribute by是指将相同的age放到同一个reducer中,sort by会按照salary进行reducer内的排序。即实现了定制化的排序


4.cluster by

当distribute by和sort by的字段相同时,可以使用cluster by代替。

select userid, age, salary
  from database.table
 cluster by age

上面代码中,意思是按照将数据按照age指定到同一个reducer中后,再在reducer内按照age进行排序。但是有一个限制就是,只能是生序排序,不能指定asc或者desc的排序方式。



参考资料

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy

你可能感兴趣的:(hive/sql,大数据,数据处理)