1. 程式人生 > >Hadoop-練習 利用hive進行資料查詢

Hadoop-練習 利用hive進行資料查詢

1   準備測試資料
  問題1:求各個部門的總工資
  問題2:求各個部門的人數和平均工資
  問題3:求每個部門最早進入公司的員工姓名
 問題4:求各個城市的員工的總工資
 問題5:列出工資比上司高的員工姓名及其工資
 問題6:列出工資比公司平均工資要高的員工姓名及其工資
 問題7:列出名字以J開頭的員工姓名及其所屬部門名稱
 問題8:列出工資最高的頭三名員工姓名及其工資
 問題9:將全體員工按照總收入(工資+提成)從高到低排列

 問題10:求任何兩名員工資訊傳遞所需要經過的中間節點數

1   準備測試資料

     建立兩張表emp  dept
create 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:求任何兩名員工資訊傳遞所需要經過的中間節點數



未解決的問題我會盡量去完善 在補全