Hive中的四种排序

1.order by

全局排序,只有一个Reducer(多个reducer无法保证全局有序),会导致当输入规模较大时,消耗较长的计算时间

hive.mapred.mode = strict 模式下 必须指定 limit 否则执行会报错。

2.sort by

不是全局排序,其在数据进入reducer前(map)完成排序,也就是说它会在数据进入reduce之前为每个reducer都产生一个排序后的文件。

因此,如果用sort by进行排序,并且设置mapreduce.job.reduces>1,则sort by只保证每个reducer的输出有序,不保证全局有序。

order by和sort by执行效率对比

一般情况下我们认为sort by 应该是比 order by 快的,因为 order by 只能使用一个reducer,进行全部排序,但是当数据量比较小的时候就不一定了,因为reducer 的启动耗时可能远远数据处理的时间长

3.distribute by

控制在map端如何拆分数据给reduce端的,hive会根据distribute by后面列,将数据分发给对应的reducer,默认是采用hash算法+取余数的方式。

4.cluster by

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,当分区字段和排序字段相同cluster by可以简化distribute by+sort by 的SQL 写法

总结:

  1. order by 是全局排序,可能性能会比较差;
  2. sort by分区内有序,往往配合distribute by来确定该分区都有那些数据;
  3. distribute by 确定了数据分发的规则,满足相同条件的数据被分发到一个reducer;
  4. cluster by 当distribute by和sort by 字段相同时,可以使用cluster by 代替distribute by和sort by,但是cluster by默认是升序,不能指定排序方向;
  5. sort by limit 相当于每个reduce 的数据limit 之后,进行order by 然后再limit ;

来源: https://www.cnblogs.com/data-magnifier/p/14243949.html

你可能感兴趣的:(大数据开发,hive,hadoop,数据仓库)