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
相关推荐
秃头菜狗28 分钟前
十四、运行经典案例 wordcount
大数据·linux·hadoop
Java战神37 分钟前
Hadoop
大数据·hadoop·分布式
lifallen4 小时前
从Apache Doris 学习 HyperLogLog
java·大数据·数据仓库·算法·apache
doll ~CJ6 小时前
数据仓库与数据挖掘基础知识
数据仓库·数据挖掘
智海观潮6 小时前
HBase高级特性、rowkey设计以及热点问题处理
大数据·hadoop·hbase
数据要素X1 天前
寻梦数据空间 | 架构篇:从概念到落地的技术实践与突破性创新
大数据·运维·数据仓库·微服务·数据治理·数据中台·可信数据空间
IT学长编程1 天前
计算机毕业设计 基于EChants的海洋气象数据可视化平台设计与实现 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
大数据·hadoop·python·毕业设计·课程设计·毕业论文·海洋气象数据可视化平台
呆呆小金人1 天前
SQL入门: HAVING用法全解析
大数据·数据库·数据仓库·sql·数据库开发·etl·etl工程师
一起喝芬达20101 天前
当数据仓库遇见AI:金融风控的「认知大脑」正在觉醒
数据仓库·人工智能
Yana_Zeng1 天前
win10安装spark3.1详细流程(小白用)
hadoop·windows·spark