hive- order by、sort by 、distribute by、cluster by

有几天儿没写博客了 ~

1.order by

order by 会对数据进行全局排序,和oracle和mysql等数据库中的order by 效果一样。对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数据多少,不管文件多少,都启用一个reduce进行处理。如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。

而且当设置 :set hive.mapred.mode=strict的时候不指定limit,执行select会报错,如下:

LIMIT must also be specifie

Stage-1: number of mappers: 73; number of reducers: 105
会再次启动一个jod,reduce个数为1,作数据归并排序
Stage-2: number of mappers: 60; number of reducers: 1

vs sort by

Stage-1: number of mappers: 73; number of reducers: 105
仅1个job

2、sort by

sort by 是单独在各自的reduce中进行排序,局部有序,不能保证全局有序,一般和distribute by 一起执行。

是局部排序,会在每个reduce端做排序,每个reduce端是排序的,也就是每个reduce出来的数据是有序的,但是全部不一定有序,除非一个reduce,一般情况下可以先进行局部排序完成后,再进行全局排序,会提高不少效率(执行局部排序之后,其实做一次归并排序就可以做到全局排序了)。

如果mapred.reduce.tasks=1和order by效果一样,如果大于1会分成几个文件输出每个文件会按照指定的字段排序,而不保证全局有序。

select prov_id,nvl(count(*),0) from A.a   where part_id='201807' and day_id='21' group by prov_id distribute by prov_id sort by prov_id;

 

3、distribute by

distribute by 是控制map端在reduce上是如何区分的,distribute by  会把指定的值发到同一个reduce中。把id相同的值放到一个reduce中执行,不是一个值一个reduce,而是相同的值进入到一个reduce。用distribute by 会对指定的字段按照hashCode值对reduce的个数取模,然后将任务分配到对应的reduce中去执行

就是在mapreduce程序中的patition分区过程,默认根据指定key.hashCode()&Integer.MAX_VALUE%numReduce 确定处理该任务的reduce

public class myPartitioner extends Partitioner<TextPair, Text>{

    @Override
    public int getPartition(TextPair key, Text value, int num) {
        // TODO Auto-generated method stub

        if(num == 0 ){
            return 0;
        }
        int a = (key.getFirst().hashCode()&Integer.MAX_VALUE)%num;
        return a;
    }

}

4、Cluster By

distribute by 和 sort by 结合使用就相当于cluster by,但是cluster by 不能指定排序为asc或 desc 的规则,只能是desc倒序排列。

select prov_id,nvl(count(*),0) from zba_dwd.dwd_d_use_cb_sms   where part_id='201807' and day_id='21' group by prov_id Cluster By prov_id;
发布了131 篇原创文章 · 获赞 79 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/qq_31780525/article/details/81978213