这篇具有很好参考价值的文章主要介绍了Hive的四种排序方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。
Hive的四种排序方法
hive排序方法,hive的排序方式
hive有四种排序方法: ORDER BY 、SORT BY 、DISTRIBUTE BY 、CLUSTER BY文章来源地址https://www.toymoban.com/news/detail-781207.html
0. 测试数据准备
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(全局排序)
order by: 全局排序, 所有的任务分配在一个reduce上面, 可以保证全局有序, 当输入规模较大时, 将会花费大量的时间进行计算;
order by 后面可以有多列进行排序, 默认按照字典排序(asc(默认):升序, desc:降序);
如果指定 hive.mapred.mode=strict(严格模式, 默认是: nonstrict(非严格模式)), 严格模式下必须使用limit来限制输出条数,否则会报错;
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 |
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 (分区内排序)
sort by 是在进入 reducer之前进行排序, 也就是说保证了局部有序, 每一个reducer出来的数据是有序的, 但是不能保证全局的数据是有序的, 除非只有一个reducer存在;
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 (分区)
distribute by 是控制map端输出结果分发, 相同字段的输出分发到一个reduce节点处理;
distribute by 一般和 sort by 一起使用, sort by 是将每一个reduce产生一个有序文件, 注意distribute by 要在 sort 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 (分区排序)
cluster by 具有 distribute by 和 sort by 的功能, 两者排序所用的列值相同时, 可以使用 cluster by 代替;
cluster by 只能使用升序, 不能使用降序, 不需要指定排序方式(ASC/DESC);
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
文章来源:https://www.toymoban.com/news/detail-781207.html
到了这里,关于Hive的四种排序方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!