1. oreder by
主要是做全局排序。
只要hive的sql中指定了order by,那么所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block,只会启动一个reducer )。但是对于大量数据这将会消耗很长的时间去执行。
这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数。因为:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。
2. sort by
每个reduce端都会进行排序,也就是局部有序,可以指定多个reduce。同时,如果想测试一下执行的效果,建议将输出结果保存到本地,并调整reduce的数量。(我设置成3个)
将查询结果保存到本地:
insert overwrite
local directory '/home/data'
select * from stu sort by gradedesc;
调整reduce的数量:
set mapreduce.job.reduce=3;
查看reduce的数量:
set mapreduce.job.reduce;
但是,只使用sort by的情况下,分区是随机分的。
3. distribute by
指定分区原则。通常和sort by一起用,distribute by必须要写在sort by之前。理解成:按照XX字段分区,再按照XX字段排序
举个例子:
只按照grade字段排序,但是不指定分区字段:
select * from stu sort by grade;
先按照class分区,再按照grade排序:
select * from stu distribute by class sort by grade;
4. cluster by
当distribute by 和 sort by 所指定的字段相同时,即可以使用cluster by。
注意:cluster by指定的列只能是降序,不能指定asc和desc。
举个例子:
select * from stu distribute by class sort by class
等价于:
select * from stu cluster by class
---------------------------------------------分割线-----------------------------------
再举个例子:
select * from stu distribute by class sort by class,name
等价于
select * from stud distribute cluster by class sort by name
注意被cluster by指定的列只能是降序,不能指定asc和desc。
5. cluster by有什么意义?
具体请查看:HIVE中,cluster by有什么意义。