hive表之 order by、sort by、cluster
2019-11-02 本文已影响0人
飞不高的老鸟
order by 语法操作
- order by 是进行全局排序,在整个作业执行过程中,只产生一个 reducer,在数据量过大的时候,执行的时间会很长 。事实上,这与分布式的思想是相背离的。
创建测试表并加载数据。
hive> create table recommend.test_tb(userid string, name string, age int)
> row format delimited
> fields terminated by ',';
数据加载。
hive> select * from recommend.test_tb;
OK
1 Jack 21
3 Tom 19
5 Will 20
4 Lily 28
7 zs 25
6 lss 22
使用 order by 语义进行处理, order by 语义有两个排序方式的选择--升序和降序,其中默认为升序。
hive> select * from recommend.test_tb order by userid;
OK
1 Jack 21
3 Tom 19
4 Lily 28
5 Will 20
6 lss 22
7 zs 25
sort by 语法
- sort by 会在 mapper 输出时对进入每个 reducer 的数据进行一次排序。它的数据处理是并行的,而且在每个 reducer 中是有序的,然而,在全局范围内并不是严格有序的。当然,如果将 reducer 数量限定为 1,也可保证它的全局有序性,此时起到的作用跟 order by 极为相似,但是不符合分布式的思想。
- sort by 可以在查询时指定 reducer 的个数,例如:
hive> set mapred.reduce.tasks=;
hive> select * from recommend.test_tb order by userid;
- sort by 是在是跟句 hash 算法将 mapper 输出数据分发到每个 reducer 中。因此,这种方式不同的 reducer 中的数据虽然有序,但是范围是有重叠的。
distribute by 语法
- distribute by 保证不同的 reducer 中的数据不存在重叠,但是不能保证单个 reducer 中的数据是有序的是。因此,通常情况下,想要得到有序非重叠的 reducer ,可以将 distribute by 与 sort by 结合使用。
Cluster by 语法
- Cluster by 的用法就行将 distribute by 与 sort by 结合使用,输出我们想要的结果,例如:
hive> select * from recommend.test_tb distribute by userid sort by userid;
hive> select * from recommend.test_tb cluster by userid;
- 使用 Cluster by 可以得到 reducer 内有序且不同 reducer 之间不重叠的数据。
- cluster by 只能按照降序进行排序,不能指定升序(asc)和降序(desc)。