hive中的四个by

来源:互联网 发布:韦德上场比赛的数据 编辑:程序博客网 时间:2024/05/16 07:15

order by

全局排序,只有一个reduce

sort by

对每一个reducer内部的数据进行排序,全局结果集来说不是排序的,即只能保证每一个reduce输出的文件中的数据是按照规定的字段进行排序的
insert overwrite local directory ” select * from table_name sort by colum_name

distribute by

注意:这边需要设置reduces的数量为分区的数量,否则不会启动相应的reducer去进行任务的执行,这最终会导致不能完全分区
set mapreduce.job.reduces=<numOfReducers>;

针对于注意事项,假设我们现在有员工信息表如下:

empno   ename   sal   deptno1       jyw     100.0   12       lq      30.0    13       xzz     10.0    24       dzz     100.0   25       kk      15.0    36       jj      30.0    3

现在我们需要按照deptno进行分区,然后按照sal进行排序,假如我们没有设置rdeucer的数量,那么有可能我们的集群只会启动一个reducer处理这批数据,那么最后的结果就是这样的:

3xzz10.025kk15.036jj30.032lq30.014dzz100.021jyw100.01

解释:因为只有一个reducer,那么在执行mapreduce的分区方法的时候:

public class HashPartitioner<K, V> extends Partitioner<K, V> {  /** Use {@link Object#hashCode()} to partition. */  public int getPartition(K key, V value,                          int numReduceTasks) {    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;  }}

因为numReduceTasks为1,所以所有的数据都跑到一个reduce里面了,然后在这个reducer里面按照sal进行了排序,得到的结果就是上面那个样子了

但是如果我们set mapreduce.job.reduces=3的话,那么相同的deptno的数据就会到同一个reducer中,并且那个reducer刚刚好只会有一个deptno的数据结果如下:

000000_0 5kk15.036jj30.03000001_0 2lq30.011jyw100.01000002_0 3xzz10.024dzz100.02

cluster by

当distribute by和sort by的字段相同的时候使用cluster by