Hive高级操作-排序操作
排序操作
1. 排序
1.1 order by(全局排序)
作用:全局排序,只有一个reducer(多个reducer无法保证全局有序)。
升序ASC(ascend),降序DESC(descend)
因为全局排序比较耗时,防止单个reducer处理时间过长,当数据规模大时,需设置hive.mapred.mode=strict ,后面必须跟limit子句。
查询员工信息按工资降序排序
select * from employInfo order by employSalary desc;
1.2 sort by(每个Reducer内部排序)
sort by 的数据只能保证在同一reduce中的数据可以按指定字段排序。
使用sort by 你可以指定执行的reduce 个数 (set mapred.reduce.tasks=),对输出的数据再执行归并排序,即可以得到全部结果。
1.3 distribute by(分区排序)
distribute by类似MR中partition(自定义分区),进行分区,结合sort by使用。distribute by要写在sort by前面。
#设置reducer的个数为4
set mapreduce.job.reduces=4;
#将查询结果导入到文件中(按照部门编号分区且按照薪资降序排序)
select * from employInfo distribute by deptID sort by employSalary desc;
1.4 cluster by
作用:当distribute by和sorts by字段相同时,可以使用cluster by方式代替。
但是排序只能是升序排序
,不能像distribute by一样去指定排序的规则为ASC或者DESC,否则报错。
select * from employInfo cluster by deptID;
select * from employInfo distribute by deptID sort by deptID;
2. 分组聚合
聚合函数是指对一组值进行计算并返回单个值的函数,通常与select语句的group by子句一起使用。
2.1 分组 Group by
🆘 使用Group by时,在select后面出现的非聚合函数字段也要出现在Group by后面。
#deptno是非聚合字段,需要出现在Group by后面
select deptno from emp group by deptno;
#avg_sal是聚合字段,不需要出现在Group by后面
select deptno,avg(salary) avg_sal from emp group by deptno;
2.2 基础聚合
sum(col) : 计算指定列的总和。
count(*) : 计算行数,可以计算所有行或指定列的非空值数。
max(col) : 返回指定列中的最大值。
min(col) : 返回指定列中的最小值。
avg(col) : 计算指定列的平均值。
2.3 高级聚合
2.3.1 GROUPING SETS
GROUPING SETS
可以用于对多个列组合进行分组聚合。
2.3.2 CUBE和ROLLUP
ROLLUP
是一种特殊的 GROUP BY
,用于创建层次化的聚合数据。
CUBE
类似于 ROLLUP
,但会生成所有可能的组合汇总。
2.4 技能实训
查询销售金额前10名的顾客
select a.id ,sum(a.subtotal) total
from
(select orders.order_customer_id id,order_items.order_item_subtotal subtotal
from
orders join customers on orders.order_customer_id=customers.customer_id
join order_items on orders.order_id=order_items.order_item_order_id) a
group by a.id order by total desc
limit 10;
本文作者:Lilaaa
本文链接:https://www.cnblogs.com/lila720/p/18273868
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步