Hive的四种排序方法

Hive的四种排序方法

hive排序方法,hive的排序方式

hive有四种排序方法: ORDER BY 、SORT BY 、DISTRIBUTE BY 、CLUSTER BY

0. 测试数据准备
sql 复制代码
--数据准备
WITH t_emp_info AS (
SELECT * FROM (
  VALUES  (1001, '研发部', 16000 )
        , (1002, '市场部', 17000 )
        , (1003, '销售部', 11000 )
        , (1004, '研发部', 15000 )
        , (1005, '销售部', 12000 )
        , (1006, '研发部', 21000 )
        , (1007, '产品部', 16000 )
        , (1008, '研发部', 18000 )
        , (1009, '市场部', 17000 )
        , (1010, '产品部', 16000 )
        , (1011, '销售部', 10000 )
        , (1012, '研发部', 18000 )
        , (1013, '市场部', 15000 ) 
        
) AS table_name(uuid, dept, salary)
)
uuid dept salary
1001 研发部 16000
1002 市场部 17000
1003 销售部 11000
1004 研发部 15000
1005 销售部 12000
1006 研发部 21000
1007 产品部 16000
1008 研发部 18000
1009 市场部 17000
1010 产品部 16000
1011 销售部 10000
1012 研发部 18000
1013 市场部 15000
1. ORDER BY(全局排序)
shell 复制代码
order by: 全局排序, 所有的任务分配在一个reduce上面, 可以保证全局有序, 当输入规模较大时, 将会花费大量的时间进行计算;
order by 后面可以有多列进行排序, 默认按照字典排序(asc(默认):升序, desc:降序);
如果指定 hive.mapred.mode=strict(严格模式, 默认是: nonstrict(非严格模式)), 严格模式下必须使用limit来限制输出条数,否则会报错;
sql 复制代码
-- order by 多列默认升序排列
SELECT 
    uuid, dept, salary
FROM t_emp_info a 
ORDER BY dept, salary
;
uuid dept salary
1007 产品部 16000
1010 产品部 16000
1013 市场部 15000
1009 市场部 17000
1002 市场部 17000
1004 研发部 15000
1001 研发部 16000
1008 研发部 18000
1012 研发部 18000
1006 研发部 21000
1011 销售部 10000
1003 销售部 11000
1005 销售部 12000
sql 复制代码
-- order by 降序排列
SELECT 
    uuid, dept, salary
FROM t_emp_info a 
ORDER BY salary DESC 
;
uuid dept salary
1006 研发部 21000
1012 研发部 18000
1008 研发部 18000
1002 市场部 17000
1009 市场部 17000
1001 研发部 16000
1007 产品部 16000
1010 产品部 16000
1004 研发部 15000
1013 市场部 15000
1005 销售部 12000
1003 销售部 11000
1011 销售部 10000
2. SORT BY (分区内排序)
shell 复制代码
sort by 是在进入 reducer之前进行排序, 也就是说保证了局部有序, 每一个reducer出来的数据是有序的, 但是不能保证全局的数据是有序的, 除非只有一个reducer存在;
sort by 出来的数据是局部有序, 在进行一次归并排序, 即可做到全局排序了, 可以提高全局排序的效率;
sql 复制代码
-- sort by 局部有序, 数据量少,没有体现局部有序的现象
SELECT 
    uuid, dept, salary
FROM t_emp_info a 
SORT BY salary
;
uuid dept salary
1011 销售部 10000
1003 销售部 11000
1005 销售部 12000
1013 市场部 15000
1004 研发部 15000
1007 产品部 16000
1001 研发部 16000
1010 产品部 16000
1009 市场部 17000
1002 市场部 17000
1012 研发部 18000
1008 研发部 18000
1006 研发部 21000
3. DISTRIBUTE BY (分区)
shell 复制代码
distribute by 是控制map端输出结果分发, 相同字段的输出分发到一个reduce节点处理;
distribute by 一般和 sort by 一起使用, sort by 是将每一个reduce产生一个有序文件, 注意distribute by 要在 sort by 之前;
sql 复制代码
-- distribute by 
SELECT 
    uuid, dept, salary
FROM t_emp_info a 
DISTRIBUTE BY salary SORT BY salary DESC 
;
uuid dept salary
1006 研发部 21000
1012 研发部 18000
1008 研发部 18000
1002 市场部 17000
1009 市场部 17000
1001 研发部 16000
1007 产品部 16000
1010 产品部 16000
1004 研发部 15000
1013 市场部 15000
1005 销售部 12000
1003 销售部 11000
1011 销售部 10000
4. CLUSTER BY (分区排序)
shell 复制代码
cluster by 具有 distribute by 和 sort by 的功能, 两者排序所用的列值相同时, 可以使用 cluster by 代替;
cluster by 只能使用升序, 不能使用降序, 不需要指定排序方式(ASC/DESC);
sql 复制代码
-- cluster by 
SELECT 
    uuid, dept, salary
FROM t_emp_info a 
CLUSTER BY salary 
;

-- 两者结果一样
SELECT 
    uuid, dept, salary
FROM t_emp_info a 
DISTRIBUTE BY salary SORT BY salary
;
uuid dept salary
1011 销售部 10000
1003 销售部 11000
1005 销售部 12000
1013 市场部 15000
1004 研发部 15000
1007 产品部 16000
1001 研发部 16000
1010 产品部 16000
1009 市场部 17000
1002 市场部 17000
1012 研发部 18000
1008 研发部 18000
1006 研发部 21000
end
相关推荐
isfox1 天前
Google GFS 深度解析:分布式文件系统的开山之作
大数据·hadoop
鼠鼠我捏,要死了捏1 天前
Hadoop NameNode内存泄漏与GC停顿问题排查与解决方案
hadoop·问题排查·jvm优化
嘉禾望岗5031 天前
Yarn介绍与HA搭建
大数据·hadoop·yarn
IT研究室1 天前
大数据毕业设计选题推荐-基于大数据的国家药品采集药品数据可视化分析系统-Spark-Hadoop-Bigdata
大数据·hadoop·信息可视化·spark·毕业设计·数据可视化·bigdata
Lx3522 天前
Hadoop性能瓶颈分析:从JVM到磁盘IO的全链路优化
大数据·hadoop
DashingGuy2 天前
数仓建模理论
数据仓库
BYSJMG2 天前
计算机毕业设计选题:基于Spark+Hadoop的健康饮食营养数据分析系统【源码+文档+调试】
大数据·vue.js·hadoop·分布式·spark·django·课程设计
励志成为糕手2 天前
Hadoop进程:深入理解分布式计算引擎的核心机制
大数据·hadoop·分布式·mapreduce·yarn
像豆芽一样优秀2 天前
Hive和Flink数据倾斜问题
大数据·数据仓库·hive·hadoop·flink
计算机毕业设计木哥2 天前
计算机毕业设计 基于Python+Django的医疗数据分析系统
开发语言·hadoop·后端·python·spark·django·课程设计