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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章