Order By
Order By :全局排序,只有一个Reducer, 就算提前设置好n个reducer order by 也是只执行一个reducer,因为全局排序,排序的仅仅是一个表罢了。order by 对于大规模数据集效率很低,毕竟只有一个reducer
Sort By
Sort By(每个 Reduce 内部排序):对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排序,此时可以使用 sort by。sort by 为每个 reducer 产生一个排序文件。每个 Reducer 内部进行排序,对全局结果集来说不是排序。
Distribute By
Distribute By(分区): 在有些情况下,我们需要控制某个特定行应该到哪个 reducer,通常是为了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by 类似 MR 中 partition(自定义分区),进行分区,结合 sort by 使用。
对于 distribute by 进行测试,一定要分配多 reduce 进行处理,否则无法看到 distribute by 的效果
➢ distribute by 的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后,余数相同的分到一个区。
➢ Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前。
Cluster By
cluster by :除了具有 distribute by 的功能外还兼具 sort by 的功能,一般用在当distribute by sort by两个分组有重复的字段的时候。但是排序只能是升序排序,不能指定排序规则为 ASC 或者 DESC。
(1)以下两种写法等价
hive (default)> select * from emp cluster by deptno;
hive (default)> select * from emp distribute by deptno sort by deptno;
注意:按照部门编号分区,不一定就是固定死的数值,可以是 20 号和 30 号部门分到一个分区里面去。
设置reduce个数:hive (default)> set mapreduce.job.reduces=?;
查看设置 reduce 个数 hive (default)> set mapreduce.job.reduces;