order by
对输入做全局排序,因此只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
SELECT * FROM db_hive.employee ORDER BY empID desc; //按照empID降序排列
sort by
不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by进行排序,并且设置mapreduce.job.reduces>1,则sort by只保证每个reducer的输出有序,不保证全局有序。
set mapreduce.job.reduces = 3; //设置reduce数目
> INSERT [OVERWRITE] LOCAL DIRECTORY '/home/hadoop/hive-exp'
> SELECT * FROM db_hive.employee
> SORT BY empID asc; //在本地会生成3个reduce结果文件,每个文件按照empID升序排列
distribute by
类似于MapReduce中分区partation,对数据进行分区,结合sort by进行使用
distribute by控制在map端如何拆分数据给reduce端。hive会根据distribute by后面列,对应reduce的个数进行分发,默认是采用hash算法。
> INSERT [OVERWRITE] LOCAL DIRECTORY '/home/hadoop/hive-exp'
> SELECT * FROM db_hive.employee
> DISTRIBUTE BY deptNum //按照部门进行分区
> SORT BY empID asc; //在本地会根据部门生成结果文件,每个文件按照empID升序排列
cluster by
Cluster by 除了具有distribute by的功能外,还会对该字段进行排序。当distribute by和sort by 字段相同时,可以使用cluster by 代替
group by
是对检索结果的保留行进行单纯分组,一般和聚合函数如AVG()、COUNT()、max()等一块用。