通俗易懂理解Hive四种排序

前言

Hive的四种排序包括Sort By、Order By、Distribute By和Cluster By。有关这四种排序的区别,在大数据面试中可能会经常被问到,在我们很多人的实际应用中可能最常用的就是全局排序order by,因此对于其他几个排序理解并不准确,接下来我用简单的案例尽量描述清楚。

数据准备

  1. Hive表

    create table scores (
    name string,
    class string,
    score int
    );
    
  2. 插入数据

    insert into scores values('Lily','1',72),('Mark','2',77),('Lucy','1',83),('Wade','2',92),
    ('Jack','1',91),('James','2',84),('Kobe','2',94),('Jay','1',85);
    
  3. 查询数据

    select * from scores;
    

ORDER BY

ORDER BY 会对全局数据进行排序,这意味着Hive会启动一个单独的reducer来接收所有mapper的输出,并在这个reducer中进行排序。这种方式在数据量很大时效率很低,因为所有数据都需要通过网络传输到一个reducer。

  • 需求

    查询按照分数从高到低排序整个表的数据。

  • SQL

    SELECT name,
           CLASS,
           score
    FROM scores
    ORDER BY score DESC;
    
  • 结果

SORT BY

SORT BY 是在每个reducer内部进行排序的。这意味着如果你使用SORT BY而没有DISTRIBUTE BY(或CLUSTER BY,它包含了DISTRIBUTE BY),Hive可能会随机地将数据分发到不同的reducer,每个reducer内部的数据会按照SORT BY指定的列进行排序。但不同的reducer之间的数据顺序是不确定的。

  • 需求
    每个班级内部的学生按照分数排序,但不需要全局排序。

  • SQL(需要配合DISTRIBUTE BY使用以控制分发)

    SELECT name,
           CLASS,
           score
    FROM scores DISTRIBUTE BY CLASS
    SORT BY score DESC;
    
  • 结果

DISTRIBUTE BY

distribute by是控制在map端如何拆分数据给reduce端的。类似于MapReduce中分区partationer对数据进行分区hive会根据distribute by后面列,将数据分发给对应的reducer,默认是采用hash算法+取余数的方式。

sort by为每个reduce产生一个排序文件,在有些情况下,你需要控制某写特定的行应该到哪个reducer,这通常是为了进行后续的聚集操作。distribute by刚好可以做这件事。因此,distribute by经常和sort by配合使用。

CLUSTER BY

cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

当分区字段和排序字段相同cluster by可以简化distribute by+sort by 的SQL 写法,也就是说当distribute by和sort by 字段相同时,可以使用cluster by 代替distribute by和sort by。

  • 需求

    每个班级内部的学生按照分数排序,但不需要全局排序。

  • SQL

    SELECT name,
           CLASS,
           score
    FROM scores CLUSTER BY CLASS;
    
  • 结果

总结

  • order by 是全局排序,可能性能会比较差;
  • sort by分区内有序,往往配合distribute by来确定该分区都有那些数据;
  • distribute by 确定了数据分发的规则,满足相同条件的数据被分发到一个reducer;
  • cluster by 当distribute by和sort by 字段相同时,可以使用cluster by 代替distribute by和sort by,但是cluster by默认是升序,不能指定排序方向;

参考文献

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy

https://sqlrelease.com/sort-by-order-by-distribute-by-and-cluster-by-in-hive

相关推荐
江畔独步3 小时前
Hive内置集合函数-size,map_keys,map_values,sort_array,array_contains
数据仓库·hive·hadoop
天地风雷水火山泽3 小时前
二百六十五、Hive——目前Hive数仓各层表样例
数据仓库·hive·hadoop
棉花糖灬3 小时前
Hive常用函数
数据仓库·hive·hadoop
mizuhokaga1 天前
Hive parquet表通过csv文件导入数据
数据仓库·hive·hadoop
小王是个弟弟2 天前
HQL-计算不一样的 MUV
数据库·hive·sql
我的K84092 天前
解决Hive乱码问题
数据仓库·hive·hadoop
盼兮*2 天前
Centos7环境下Hive的安装
大数据·数据仓库·hive·hadoop
大数据深度洞察3 天前
中级练习[6]:Hive SQL订单配送与用户社交行为分析
大数据·数据仓库·hive·sql
Data 3173 天前
Hadoop生态圈拓展内容(二)
大数据·数据仓库·hive·hadoop