Hive中的排序通常涉及到order by 、sort by、distribute by 、cluster by
一、语法
selectcolumn1,column2, ...
from table
[where 条件]
[group by column]
[order by column]
[cluster by column| [distribute by column] [sort by column]
[limit [offset,] rows];
二、排序介绍
2.1 order by
Hive的order by 与其他的sql一样,对所有数据进行排序,即:全局排序,只有一个 Reducer。在严格模式(set hive.mapred.mode=strict
)下,执行order by 必须加上limit 子句,避免数据集行数过大。order by 字段 ,默认是升序。
2.2 distribute by和sort by
针对order by的缺点,Hive提供了distribute by 分区和sort by 排序。shuffle阶段,基于key值,可以控制数据发往具体某个分区 ,相同key的数据会分发到同一个reduceTask中。distribute by类似 MR 中的自定义分区 partition ,需要结合sort by使用。例如按照日期、类型等进行distribute by分区,再使用sort by 按照期望的顺序排序。
- distribute by 的分区规则:分区字段的hashcode值对reduce 个数取模后, 余数相同的数据会分发到同一个reduceTask中。
- Hive 要求 distribute by语句要写在sort by 语句之前。例如:
select * from user_info distribute by user_id sort by login_date desc;
2.3 cluster by
当 distribute by 和 sorts by 字段相同时,可以使用 cluster by 方式。 但是排序 只能是升序
排序, 不能指定排序规则为 acs 或者 desc 。
select * from user_info distribute by user_id sort by user_id;
--等价于
select * from user_info cluster by user_id;
三、总结
- order by全局排序,只有一个reducer,结果输出在一个文件中,当数据量较大时,需要较长的计算时间;
- distribute by根据指定字段将数据分组,分组编号 = 【字段的hashcode 】% 【reduce数】,sort by是在分组之后,每个组内局部排序;
- cluster by既有分组,又有排序,前提是分组与排序字段相同,当distribute和sort的字段是同一个时,cluster by = distribute by + sort by