hive表之 order by、sort by、cluster by、distribute by 对比

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)。

你可能感兴趣的:(hive表之 order by、sort by、cluster by、distribute by 对比)