hive 时间函数_Hive常用大法(聚合/排序/分组)

Hello大家好,今天我们继续上篇文章,为大家分享一些Hive在工作中常用的聚合函数,分组函数,排序等等…………

我们就直接从聚合函数开始,什么是聚合函数呢,其实就是一句话,将多行合并为一行,就这么简单,常用到的聚合函数主要有一下几种:sum,count,max,min,avg等,其中注意的是count是对记录的统计,sum是对值的累加~

假设我们有一张员工薪资表(emp_table),现在要统计员工的最大,最小,平均工资和所有工资的和,代码如下:

hive> select max(salary),min(salary),avg(salary),sum(salary) from emp_table;

查询记录记录数

hive> select count(*) from emp_table;hive> select count(1) from emp_table;-- 注意的是,上述俩种方式一样-- count() count(1) :这两种方式是一样的。

接下来我们看看Hive中的几种排序方式

首先第一个排序是order by排序,order by会对输入的数据做全局的排序,所以只会有一个reduce,这样的话在大量的数据面前查询效率较低,费时较长

hive> select * from salary order by salary desc;-- desc 升序 asc降序

另一个就是sort by排序,sort by排序不是全局排序,他在进入reduce阶段之前就已经排序,使用sort by排序可以设定reduce的数量

-- 启动两个reduceset mapred.reduce.tasks=2; 

启动后执行sort by排序你就会发现reduce启动了2个

MapReduce Jobs Launched: Stage-Stage-1: Map: 1 Reduce: 2 Cumulative CPU: 6.07 sec HDFS Read: 11241 HDFS Write: 460 SUCCESSTotal MapReduce CPU Time Spent: 6 seconds 70 msec

接下来是distribute by排序, distribute by通过计算一个列的值进行分区,有几个分区sort by就执行几次,也就会有多少个reduce

-- 通过 distribute by 对列计算值分区,然后查询排序select * from salary distribute by depart sort by salary asc;
03f526b4b5418f945398169f09954eb6.png

最后一个是cluster by聚集排序,就是distribute by + sort by的组合,但是只能默认升序,不支持自定义升序排序

hive> select * from salary cluster by salary;
5c2b12a6e685754b7cc8e96046c45597.png

分组函数

在hive中我们使用group by方法对数据进行分组,hive有个特殊的嗜好,就是在group by分组的字段一定要出现在select的查询字段中,否则报错

接下来我们就对我们的员工表按照部门进行排序

hive> select depar from emp group by depar;--结果研发部市场部过控部……………………

查询每个部门的平均薪资

hive> select depar,avg(salary) avg_sal from emp group by depar;研发部 15400.345234523423市场部 34243.423424过控部 34242.5454654654……………………-- 数据胡编乱造的

查询平均薪资大于2000的部门

hive> select depar,avg(salary) from emp group by deptar having avg(salary) > 2000;

按照部门和入职时间进行分组

hive> select depar,hiredate from emp group by depar,hiredate;

按照部门和入职时间进行分组并计算出每组的人数

hive> select depar,hiredate,count(ename) from emp group by depar,hiredate;

在hive分组中还有一个case when then end分组方式,该分组方式不会经过mr处理,示例如下:

查询员工的姓名和工资等级,按如下规则显示

salary小于等于1000,显示LOWER,

salary大于等于1000且小于等于2000,显示MIDDLE,

salary大于2000小于等于4000,显示HIGH

salary大于4000显示HIGHEST

select ename,salarycasewhen salary > 0 and salary <= 1000 then 'LOWER'when salary > 1000 and salary <= 2000 then 'MIDDLE'when salary > 20000 and salary <= 4000 then 'HIGH'ELSE 'HIGHEST'endfrom emp;
f82fe0b1310abf2072ffc406cdf6974c.png

本片文章参考资料

https://blog.csdn.net/Realoyou/article/details/79189726https://blog.csdn.net/yu0_zhang0/article/details/79011192https://blog.csdn.net/doveyoung8/article/details/80022579http://www.cnblogs.com/lishouguang/p/4560837.htmlhttps://blog.csdn.net/qq_32941881/article/details/82347933

强烈推荐:

https://www.iteblog.com/archives/2258.html#1UNIX_from_unixtime
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值