1. 聚合函數
通俗說,聚合函數是將多行數據導出一條結果
常用的聚合函數有:max,min,count,sum,avg對emp表查詢員工的最大、最小、平均工資及所有工資的和
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) 18. hive> select max(salary),min(salary),avg(salary),sum(salary) from emp; 19. 5000.0 800.0 2073.214285714286 29025.0
查詢記錄數count
1. hive> select count(*) from emp; 2. hive> select count(1) from emp; 3. 14
使用1和*都是對錶進行記錄數查詢
2. 分組函數(group by)
分組字段要和查詢字段匹配
分組函數會有mr
分組函數會產生數據傾斜按照部門進行分組
1. hive> select deptno from emp group by deptno; 2. 結果: 3. 10 4. 20 5. 30
查詢每個部門的平均工資
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
查詢平均工資大於2000的部門
1. hive> select deptno,avg(salary) from emp group by deptno having avg(salary) > 2000; 2. 結果: 3. 10 2916.6666666666665 4. 20 2175.0
分組函數使用條件語句不能使用where,用having
按照部門和入職時間進行分組
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
按照部門和入職時間進行分組並計算出每組的人數
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,顯示highest1. 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 17. SCOTT 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. join
- 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; 19. OK 20. 1 20 21. 2 30 22. 4 40
內連接
內連接即基於on語句,僅列出表1和表2符合連接條件的數據1. hive> select a.id,a.name,b.age from join_a a join join_b b on a.id=b.id; 2. 結果: 3. 1 zhangsan 20 4. 2 lisi 30 5. hive> select * from join_a a join join_b b on a.id=b.id; 6. 結果: 7. 1 zhangsan 1 20 8. 2 lisi 2 30
左連接
左連接是顯示左邊的表的所有數據,如果有右邊表與之對應,則顯示;否則顯示null1. hive> select a.id,a.name,b.age from join_a a left join join_b b on a.id=b.id; 2. 結果: 3. 1 zhangsan 20 4. 2 lisi 30 5. 3 wangwu NULL
右連接
右連接是顯示右邊的表的所有數據,如果有左邊表與之對應,則顯示;否則顯示null1. hive> select a.id,a.name,b.age from join_a a right join join_b b on a.id=b.id; 2. 結果: 3. 1 zhangsan 20 4. 2 lisi 30 5. NULL NULL 40
全連接
相當於表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
笛卡爾積
笛卡爾積(沒有連接條件)會針對表1和表2的每條數據做連接
join(cross join)1. hive > select a.id,a.name,b.age from join_a a cross join join_b b; 2. 結果: 3. 1 zhangsan 20 4. 1 zhangsan 30 5. 1 zhangsan 40 6. 2 lisi 20 7. 2 lisi 30 8. 2 lisi 40 9. 3 wangwu1 20 10. 3 wangwu1 30 11. 3 wangwu1 40
來自@若澤大數據