hive 排序 order by sort by distribute by cluster by
order by:
order by是全局排序,受hive.mapred.mode的影响。
使用orderby有一些限制:
1、在严格模式下(hive.mapred.mode=strict),orderby必须跟limit一起使用(?)。
原因:在执行orderby时,hive使用一个reducer,如果查询结果量很大,这个reducer执行起来会很费劲,所以必须要限制查询输出结果的数量。
limit n 之后,reducer处理的数据有n * count(map)条数据。
![](https://note.wiz.cn/api/document/files/unzip/dcec1f50-de6d-4955-a388-f513712aea71/629d3060-ce43-49b8-9335-89a52a7a5cb5.2427/index_files/c36ccbb0-6831-4bf6-9ad0-9ce7d8cf51af.png)
2、在非严格模式下(默认,hive.mapred.mode=nonstrict),orderby可以不跟limit一起使用。
相关设置:
set hive.mapred.mode=strict;
set hive.mapred.mode=nonstrict;
例子:
select id, name from user order by name limit 10;
sort by:
对每个reducer里的数据进行排序,如果有多个reducer执行查询,则查询出来的数据是部分排序的。。
也可以使用limit n来减少reducer处理的数据量。
相关设置:
set mapred.reduce.tasks=n;
例子
hive使用2个reducer执行查询select col1, col2 from t1 sort by col1 asc, col2 desc,则:
一个reducer的输出结果是:
0 5
0 3
3 6
9 1
另一个reducer的输出结果是:
0 4
0 3
1 1
1 5
说明:对同一个reducer里的数据进行排序。
distribute by:
hive执行查询时,在mr的分区结果根据distributeby的字段进行分区,这样相同字段的数据由同一个reducer处理。
相关设置:
set mapred.reduce.tasks=n;
例子
某一列的数据如下:
x1
x2
x3
x4
x1
对这个字段distributeby后,
reducer1里的数据是:
x1
x2
x1
reducer2里的数据是:
x3
x4
说明:同一个值(x1)交由同一个reducer处理,但是数据是无序的。
cluster by:
clusterby是distributeby和sortby的快捷方式,根据clusterby字段进行分区并排序。
例子
某一列的数据如下:
x1
x2
x3
x4
x1
对这个字段distributeby后,
reducer1里的数据是:
x1
x1
x2
reducer2里的数据是:
x3
x4
说明:同一个值(x1)交由同一个reducer处理,数据也是有序的。