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