Hive语法之排序


文章目录

  • Hive语法之排序
  • 全局排序(Order By)
  • 升序降序
  • 按照别名排序
  • 多个列排序
  • 每个 Reduce 内部排序(Sort By)
  • 设置 reduce 个数
  • 查看设置 reduce 个数
  • 分区排序(Distribute By)
  • 设置 reduce 个数
  • 簇排序(Cluster By)



全局排序(Order By)

Order By:全局排序,只有一个 Reducer

ORDER BY 子句排序
ORDER BY 子句在 SELECT 语句的结尾

ASC(ascend): 升序(默认)
DESC(descend): 降序

升序降序

查询员工按消费升序排列

select * from t_window order by cost;

by hive必要时使用order hive order by desc_by hive必要时使用order

查询员工按消费升序降序

select * from t_window order by cost desc ;

by hive必要时使用order hive order by desc_by hive必要时使用order_02

按照别名排序

按照顾客消费金额的 2 倍排序

select name, cost*2 twocost from t_window order by twocost;

by hive必要时使用order hive order by desc_升序_03

多个列排序

按照日期和金额升序排序

select name, orderdate, cost from t_window order by orderdate, cost;

by hive必要时使用order hive order by desc_hadoop_04

每个 Reduce 内部排序(Sort By)

Sort By:对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排序,此时可以使用 sort by。
Sort by 为每个 reducer 产生一个排序文件。每个 Reducer 内部进行排序,对全局结果集来说不是排序。

设置 reduce 个数

set mapreduce.job.reduces=3;

查看设置 reduce 个数

set mapreduce.job.reduces;

by hive必要时使用order hive order by desc_大数据_05

根据消费金额查看顾客信息

select * from t_window sort by cost;

by hive必要时使用order hive order by desc_大数据_06

分区排序(Distribute By)

Distribute By: 在有些情况下,我们需要控制某个特定行应该到哪个 reducer,通常是为了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by 类似 MR 中 partition(自定义分区),进行分区,结合 sort by 使用。
对于 distribute by 进行测试,一定要分配多 reduce 进行处理,否则无法看到 distribute by 的效果。
注意:distribute by 的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后,余数相同的分到一个区。Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前。

设置 reduce 个数

set mapreduce.job.reduces=3;

先按日期分区,再按金额降序

select * from t_window distribute by orderdate sort by cost desc;

by hive必要时使用order hive order by desc_大数据_07

簇排序(Cluster By)

当 distribute by 和 sorts by 字段相同时,可以使用 cluster by 方式。
cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。但是排序只能是升序排序,不能指定排序规则为 ASC 或者 DESC。

cluster by = distribute by +sort by 。

两种写法等价

select * from t_window cluster by cost
select * from t_window distribute by orderdate sort by cost desc;