Mysql中group by后select中只能出现group by字段和聚合函数,hive的分区排序可以模拟分组排序的效果,并返回所有列
先设置reduce个数:
set mapreduce.job.reduces = 3;
sort by
每个Reduce内部排序
测试数据:
sort by 按照年龄分区内降序
select * from yg sort by age desc;
可以看分区为三份,每一份区内排序,但是分区规则没有指定
导出查看效果:
insert overwrite local directory '/opt2/sort' select * from yg sort by age desc;
导出也是导出三份。与设置的reduce个数一样
distribute by + sort by
作用:指定分区规则并排序
注意,Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前
示例:按照性别,年龄降序排序
select * from yg distribute by gender sort by age desc;
导出查看数据:
insert overwrite local directory '/opt2/sort' select * from yg distribute by gender sort by age desc;
其中由于设置的reduce个数是3,性别去模以hashcode取余也只有两种结果,只会到两个reduce中,所以导出的数据中其中一个文件为空
cluster by
当distribute by和sorts by字段相同时,可以使用cluster by方式
但是排序只能是升序排序,不能指定排序规则为ASC或者DESC
例如:
select * from yg distribute by age sort by age desc;
等同于:
select * from yg cluster by age;