order by && sort by && distribute by && cluster by 区分

order by
1、order by会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序);
    只有一个reducer,会导致当输入规模较大时,需要较长的计算时间,速度会非常慢;
2、hive.mapred.mode对order by的影响
当hive.mapred.mode=nonstrict时,order by和数据库中的order by功能一致,按照某一项或者几项排序输出;
当hive.mapred.mode=strtict时,hive的order by必须要制定limit,否则执行会报错。
设置hive.mapred.mode的值
    set hive.mapred.mode=nonstrict; (default value)
    set hive.mapred.mode=strict;
    hive> select * from test order by id;
    FAILED: Error in semantic analysis: 1:28 In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'id'
    报错原因:在order by状态下所有数据会到一台服务器进行reducer操作,也就是说只有一个reducer,如果在数据量大的情况下会出现无法输出结果的情况,如果进行limit n,那只有 n * map number条记录而已。只有一个reduce也可以处理过来。
    sort by
    1、可以有多个reduce task;
    2、sort by不受hive.mapred.mode是否是strict、nostrict的影响;
    3、sort by的数据只能保证在同一reducer中的数据可以按照指定字段排序;
    4、使用sort by你可以指定执行的reduce的个数(set mapred.reduce.tasks=<number>),对输出的数据再执行归并排序,即可以得到全部结果;
    distribute by
    1、按照指定的字段对数据进行划分到不同的输出reduce文件中(可以指定map到reduce端的分发key, 这样可以充分利用hadoop资源, 在多个reduce中局部按需要排序的字段进行排序)
    insert overwrite local directory '/home/hadoop/out' select * from test order by name distribute by length(name);
    此方法会根据name的长度划分到不同的reduce中,最终输出到不同的文件中;
    2、length是内建函数,也可以指定其他的函数或者使用自定义函数;
    3、distribute by与sort by连用,可发挥很好的作用:
    举例:
    select s.ymd, s.symbol, s.price_close from stocks s distribute by s.symbol sort by s.symbol asc, s.ymd desc;
    按照symbol指定到reduce,每个reduce中按照symbol升序排序,当symbol相同时,按照ymd降序;
    cluster by
    1、cluster by除了具有distribute by的功能外还兼具sort by功能;
    2、但是排序只能倒序,不能指定排序规则为asc或者desc;
    3、当distributed by col1与sort by col1连用,且跟随的字段相同时,可使用cluster by简写。
    举例:
    select s.ymd, s.symbol, s.price_close from stocks s cluster by s.symbol;
 

0 个评论

要回复文章请先登录注册