Hadoop-練習 利用hive進行資料查詢
1 準備測試資料
問題1:求各個部門的總工資
問題2:求各個部門的人數和平均工資
問題3:求每個部門最早進入公司的員工姓名
問題4:求各個城市的員工的總工資
問題5:列出工資比上司高的員工姓名及其工資
問題6:列出工資比公司平均工資要高的員工姓名及其工資
問題7:列出名字以J開頭的員工姓名及其所屬部門名稱
問題8:列出工資最高的頭三名員工姓名及其工資
問題9:將全體員工按照總收入(工資+提成)從高到低排列
問題10:求任何兩名員工資訊傳遞所需要經過的中間節點數
1 準備測試資料
建立兩張表emp deptcreate table dept(id int,name string,city string) row format delimited fields terminated by ',';
create table emp(
mpno int,
name string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptid int)
row format delimited fields terminated by ',';
向表中新增資料
10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON
7369,SMITH,CLERK,7902,1981-6-9,800,,20
7499,ALLEN,SALESMAN,7698,1981-11-17,1600,300,30
7521,WARD,SALESMAN,7698,1982-1-23,1250,500,30
7566,JONES,MANAGER,7839,1980-12-17,2975,,20
7654,MARTIN,SALESMAN,7698,1981-4-2,1250,1400,30
7698,BLAKE,MANAGER,7839,1987-4-19,2850,,30
7782,CLARK,MANAGER,7839,1987-5-23,2450,,10
7839,KING,PRESIDENT,,1980-12-3,5000,,10
7844,TURNER,SALESMAN,7698,1983-11-22,1500,0,30
7900,JAMES,CLERK,7698,1984-3-11,950,,30
7902,FORD,ANALYST,7566,1987-10-09,3000,,20
7934,MILLER,CLERK,7782,1981-2-13,1300,,10
load data local inpath '/home/hadoop/dept.txt' into table dept;
load data local inpath '/home/hadoop/emp.txt' into table emp;
問題1:求各個部門的總工資
select d.name , e.sumsal from dept d join
(select deptid ,sum(sal) sumsal from emp group by deptid) e on e.deptid=d.id;
問題2:求各個部門的人數和平均工資
select d.name , e.avg ,e.count from dept d join
(select deptid ,avg(sal) avg,count(*) count from emp group by deptid) e on e.deptid=d.id ;
問題3:求每個部門最早進入公司的員工姓名
select e.name , r.minhiredate from emp e join
(select deptid, min(to_date(hiredate)) as minhiredate from emp group by deptid) r on r.deptid=e.deptid and to_date(e.hiredate)=r.minhiredate;
問題4:求各個城市的員工的總工資
select d.city , e.sumsal from dept d join
(select deptid ,sum(sal) sumsal from emp group by deptid) e on e.deptid=d.id ;
問題5:列出工資比上司高的員工姓名及其工資
select e.name ,e.sal from emp e ,
(select sal ,mpno from emp) r where r.mpno=e.mgr and e.sal >r.sal;
問題6:列出工資比公司平均工資要高的員工姓名及其工資
select e.name ,e.sal from emp e ,
(select avg(sal) avg from emp) r where e.sal>r.avg;
問題7:列出名字以J開頭的員工姓名及其所屬部門名稱
select d.name , r.name from dept d join
(select name , deptid from emp where name like 'J%') r where r.deptid=d.id
問題8:列出工資最高的頭三名員工姓名及其工資
select name,sal from emp order by sal desc limit 3
問題9:將全體員工按照總收入(工資+提成)從高到低排列
這裡存在一個 問題 當 comm 屬性為null 值的時候 進行 累加 會出導致 值為null
使用nvl()函式 nvl(屬性名, 預設值) 當屬性為null 會使用預設值
coalesce函式也可以實現判空的功能 coalesce(屬性名,引數1,引數2)
引數1 為不為null輸出的內容 引數2 為null 輸出的內容
也可以使用自定義函式
select name,(sal+nvl(comm,0.0)) as salary from emp order by salary desc;
問題10:求任何兩名員工資訊傳遞所需要經過的中間節點數
未解決的問題我會盡量去完善 在補全