order by(全局排序)
- order by (asc|desc)类似于标准SQL
只使用一个Reducer执行全局数据排序
速度慢,应提前做好数据过滤
支持使用case when或表达式
支持按位置编号排序
set hive.groupby.orderby.position.alias=true;
案例:
select name,id,info from employee_id order by info.age;
select name,id from employee_id order by 2 desc;
select * from employee_id order by technol["Sales"] desc;
sort by(分区内排序)/distribute by
- sort by对每个Reducer中的数据进行排序
当Reducer数量设置为1时,等于order by
排序列必须出现在select column列表中 - distribute by类似于标准SQL中的group by
确保具有匹配列值的行被分区到相同的Reducer
不会对每个Reducer的输出进行排序
通常使用在sort by语句之前
案例:
#group by 分组
select address,count(address) from employee_id group by address;
#distribute by 排序(不能使用聚合函数)
select address from employee_id distribute by address;
select address from employee_id distribute by address sort by address;
cluster by
- cluster by = distribute by + sort by
不支持ASC|DESC
排序列必须出现在select column列表中
为了充分利用所有的Reducer来执行全局排序,可以先使用cluster by,然后使用order by
总结
- order by是全局排序,但在数据量大的情况下,花费时间会很长
- sort by是将reduce的单个输出进行排序,不能保证全局有序
- distribute by可以按指定字段将数据划分到不同的reduce中
- 当distribute by的字段和sort by的字段相同时,可以用cluster by来代替 distribute by with sort by。
- distribute by和group by的区别
- distribute by不能使用聚合函数,通常使用在sort by语句之前
- group by通常与having使用,可以使用聚合函数