Hive常用的基础sql语法--聚合函数,分组函数的使用和多表查询

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yu0_zhang0/article/details/79011192
1 聚合函数
一句话概括什么是聚合函数:多行合并为一行。(大家应该明白了吧)
常用函数:sum,count,max,min,avg。
1 hive> select * from emp;
2 OK
3 7369    SMITH   CLERK   7902    1980/12/17      800.0   NULL    20
4 7499    ALLEN   SALESMAN        7698    1981/2/20       1600.0  300.0   30
5 7521    WARD    SALESMAN        7698    1981/2/22       1250.0  500.0   30
6 7566    JONES   MANAGER 7839    1981/4/2        2975.0  NULL    20
7 7654    MARTIN  SALESMAN        7698    1981/9/28       1250.0  1400.0  30
8 7698    BLAKE   MANAGER 7839    1981/5/1        2850.0  NULL    30
9 7782    CLARK   MANAGER 7839    1981/6/9        2450.0  NULL    10
10 7788    SCOTT   ANALYST 7566    1987/4/19       3000.0  NULL    20
11 7839    KING    PRESIDENT       NULL    1981/11/17      5000.0  NULL    10
12 7844    TURNER  SALESMAN        7698    1981/9/8        1500.0  0.0     30
13 7876    ADAMS   CLERK   7788    1987/5/23       1100.0  NULL    20
14 7900    JAMES   CLERK   7698    1981/12/3       950.0   NULL    30
15 7902    FORD    ANALYST 7566    1981/12/3       3000.0  NULL    20
16 7934    MILLER  CLERK   7782    1982/1/23       1300.0  NULL    10
17 Time taken: 5.998 seconds, Fetched: 14 row(s)

接下来我们对emp表进行操作: 
1.查询员工的最大、最小、平均工资及所有工资的和
   1 hive> select max(salary),min(salary),avg(salary),sum(salary) from emp;
   2 结果:
   3 5000.0  800.0   2073.214285714286       29025.0

2.查询记录数

 1 hive> select count(*) from emp;
 2 hive> select count(1) from emp;
 3 结果:
 4 14
*注:**count() count(1) :这两种方式是一样的。

2 分组函数(Group by)
注:

使用Group by时,在Group by后面出现的字段也要出现在select后面。
会执行mr* 
1.按照部门进行分组
  1 hive> select deptno from emp group by deptno;
  2 结果:
  3 10
  4 20
  5 30
2.查询每个部门的平均工资

  1 hive> select deptno,avg(salary) avg_sal from emp group by deptno; 
  2 结果: 
  3 10 2916.6666666666665 
  4 20 2175.0 
  5 30 1566.6666666666667
3.查询平均工资大于2000的部门(使用having子句限定分组查询)

  1 hive>  select deptno,avg(salary) from emp group by deptno having avg(salary) > 2000;
  2 结果:
  3 10      2916.6666666666665
  4 20      2175.0
3.按照部门和入职时间进行分组(先按照部门进行分组,然后针对每组按照入职时间进行分组)

  1 hive> select deptno,hiredate from emp group by deptno,hiredate;
  2 结果:
  3 10      1981/11/17
  4 10      1981/6/9
  5 10      1982/1/23
  6 20      1980/12/17
  7 20      1981/12/3
  8 20      1981/4/2
  9 20      1987/4/19
  10 20      1987/5/23
  11 30      1981/12/3
  12 30      1981/2/20
  13 30      1981/2/22
  14 30      1981/5/1
  15 30      1981/9/28
  16 30      1981/9/8
4.按照部门和入职时间进行分组并计算出每组的人数

  1 hive> select deptno,hiredate,count(ename) from emp group by  deptno,hiredate;
  2 结果:
  3 10      1981/11/17      1
  4 10      1981/6/9        1
  5 10      1982/1/23       1
  6 20      1980/12/17      1
  7 20      1981/12/3       1
  8 20      1981/4/2        1
  9 20      1987/4/19       1
  10 20      1987/5/23       1
  11 30      1981/12/3       1
  12 30      1981/2/20       1
  13 30      1981/2/22       1
  14 30      1981/5/1        1
  15 30      1981/9/28       1
  16 30      1981/9/8        1
3 case when then end(不会跑mr)
查询员工的姓名和工资等级,按如下规则显示 
salary小于等于1000,显示LOWER 
salaray大于1000且小于等于2000,显示MIDDLE 
salaray大于2000小于等于4000,显示MIDDLE 
sal大于4000,显示highest
  1 select ename, salary, 
  2 case
  3 when salary > 1 and salary <= 1000 then 'LOWER'
  4 when salary > 1000 and salary <= 2000 then 'MIDDLE'
  5 when salary > 2000 and salary <= 4000 then 'HIGH'
  6 ELSE 'HIGHEST'
  7 end
  8 from emp;
  9 结果:
  10 SMITH   800.0   LOWER
  11 ALLEN   1600.0  MIDDLE
  12 WARD    1250.0  MIDDLE
  13 JONES   2975.0  HIGH
  14 MARTIN  1250.0  MIDDLE
  15 BLAKE   2850.0  HIGH
  16 CLARK   2450.0  HIGH
  17SCOTT   3000.0  HIGH
  18 KING    5000.0  HIGHEST
  19 TURNER  1500.0  MIDDLE
  20 ADAMS   1100.0  MIDDLE
  21 JAMES   950.0   LOWER
  22 FORD    3000.0  HIGH
  23 MILLER  1300.0  MIDDLE
4 多表查询
注意: Hive中Join的关联键必须在ON ()中指定,不能在Where中指定,否则就会先做笛卡尔积,再过滤。 
- 创建表

  1 hive> create table join_a(
      2 > id int,
      3 > name string
      4 > )
      5 > ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";

  6 hive> load data local inpath '/home/hadoop/data/join_a.txt' OVERWRITE INTO TABLE join_a;

  7 hive> select * from join_a;
  8 OK
  9 1       zhangsan
  10 2       lisi
  11 3       wangwu

  12 hive> create table join_b(
     13 > id int,
      14 > age int
      15 > )
  16 ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";

  17 hive> load data local inpath '/home/hadoop/data/join_b.txt' OVERWRITE INTO TABLE join_b;

  18 hive> select * from join_b;
OK
 1       20
 2       30
 4       40

4.1 内连接
内连接即基于on语句,仅列出表1和表2符合连接条件的数据
hive> select a.id,a.name,b.age from join_a a join join_b b on a.id=b.id;
结果:
1       zhangsan        20
2       lisi    30

hive> select * from join_a a join join_b b on a.id=b.id;
结果:
1       zhangsan        1       20
2       lisi    2       30

4.2 左连接
左连接是显示左边的表的所有数据,如果有右边表与之对应,则显示;否则显示null
hive> select a.id,a.name,b.age from join_a a left join join_b b on a.id=b.id;
结果:
1       zhangsan        20
2       lisi    30
3       wangwu NULL

4.3 右连接
右连接是显示右边的表的所有数据,如果有左边表与之对应,则显示;否则显示null
hive> select a.id,a.name,b.age from join_a a right join join_b b on a.id=b.id;
结果:
1       zhangsan        20
2       lisi    30
NULL    NULL    40

4.4 全连接
相当于表1和表2的数据都显示,如果没有对应的数据,则显示Null.
hive > select a.id,a.name,b.age from join_a a full join join_b b on a.id=b.id;
结果:
1       zhangsan        20
2       lisi    30
3       wangwu1 NULL
NULL    NULL    40

4.5 笛卡尔积
笛卡尔积(没有连接条件)会针对表1和表2的每条数据做连接 
join(cross join)
hive > select a.id,a.name,b.age from join_a a cross join join_b b;
结果:
1       zhangsan        20
1       zhangsan        30
1       zhangsan        40
2       lisi    20
2       lisi    30
2       lisi    40
3       wangwu1 20
3       wangwu1 30
3       wangwu1 40

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值