• hive 排序 order by sort by distribute by cluster by


    order by:

        order by是全局排序,受hive.mapred.mode的影响。

        使用orderby有一些限制:
        1、在严格模式下(hive.mapred.mode=strict),orderby必须跟limit一起使用(?)。
            原因:在执行orderby时,hive使用一个reducer,如果查询结果量很大,这个reducer执行起来会很费劲,所以必须要限制查询输出结果的数量。
            limit n 之后,reducer处理的数据有n * count(map)条数据。
        
        2、在非严格模式下(默认,hive.mapred.mode=nonstrict),orderby可以不跟limit一起使用。

        相关设置:
        set hive.mapred.mode=strict;
        set hive.mapred.mode=nonstrict;    

        例子:
        select id, name from user order by name limit 10;

    sort by:

        对每个reducer里的数据进行排序,如果有多个reducer执行查询,则查询出来的数据是部分排序的。

        也可以使用limit n来减少reducer处理的数据量。

        相关设置:
        set mapred.reduce.tasks=n;

        例子
        hive使用2个reducer执行查询select col1, col2 from t1 sort by col1 asc, col2 desc,则:
        一个reducer的输出结果是:
        0    5
        0    3
        3    6
        9    1
        另一个reducer的输出结果是:
        0    4
        0    3
        1    1
        1    5
        说明:对同一个reducer里的数据进行排序。

    distribute by:

        hive执行查询时,在mr的分区结果根据distributeby的字段进行分区,这样相同字段的数据由同一个reducer处理。
        
        相关设置:
        set mapred.reduce.tasks=n;

        例子
        某一列的数据如下:
        x1
        x2
        x3
        x4
        x1
        对这个字段distributeby后,
        reducer1里的数据是:
        x1
        x2
        x1
        reducer2里的数据是:
        x3
        x4
        说明:同一个值(x1)交由同一个reducer处理,但是数据是无序的。

    cluster by:

        clusterby是distributeby和sortby的快捷方式,根据clusterby字段进行分区并排序。
        
        例子
        某一列的数据如下:
        x1
        x2
        x3
        x4
        x1
        对这个字段distributeby后,
        reducer1里的数据是:
        x1
        x1
        x2
        reducer2里的数据是:
        x3
        x4
        说明:同一个值(x1)交由同一个reducer处理,数据也是有序的。
        





  • 相关阅读:
    Redis 设计与实现(第三章) -- 链表adlist
    Redis 设计与实现(第二章) -- SDS
    MySQL索引背后的数据结构及算法原理(转)
    MySQL索引原理及慢查询优化(转)
    MySQL常见的一些面试题(未完待续)
    js 获取前天、昨天、今天、明天、后天的时间
    linux 下nohup 使用
    java split 分割字符串用法
    Python 获取URL访问的HEAD头信息
    MySQL日期数据类型、时间类型使用总结
  • 原文地址:https://www.cnblogs.com/lishouguang/p/4560604.html
Copyright © 2020-2023  润新知