学习笔记Hive(五) —— Hive应用(3)—— Hive查询
五、Hive查詢
5.1、創(chuàng)建職工信息表
任務實現(xiàn):
1、創(chuàng)建表dept,emp和salgrade
2、導入數(shù)據(jù)
將數(shù)據(jù)emp.txt導入到表emp
將數(shù)據(jù)dept.txt導入到表dept
#dept.txt 10,ACCOUNTING,NEW YORK 20,RESEARCH,DALLAS 30,SALES,CHICAGO 40,OPERATIONS,BOSTON將數(shù)據(jù)salgrade.txt導入到表salgrade
#salgrade.txt 1,700,1200 2,1201,1400 3,1401,2000 4,2001,3000 5,3001,9999
5.2、查詢?nèi)腴T
5.2.1、Select語法
SELECT [ALL|DISTINCT] 字段列表(字段1 別名,....) FROM 表1 別名, 表2 別名, .... WHERE 條件 …. GROUP BY 分組字段 HAVING(組約束條件) ORDER BY 排序字段1 Asc | Desc, 字段2 Asc|Desc, ..... [CLUSTER BY 字段 | [DISTRIBUTE BY字段] [SORT BY字段]] LIMIT M,N; DISTRIBUTE BY 相同字段值會分到一個分區(qū) CLUSTER BY 相當于前兩個5.2.2、distinct去重查詢
任務實現(xiàn):
1.查詢emp中所有的部門編號
2.查詢emp中相同部門不同職位的部門職位信息
5.2.3、order by查詢
任務實現(xiàn):
1.將部門編號不為10的所有員工按員工編號升序排列
2.將所有員工先按部門編號升序,當部門一樣時,再按姓名降序排
5.2.4、內(nèi)置函數(shù)
任務實現(xiàn):
1.查看emp表中平均薪水是多少并對其四舍五入保留兩位小數(shù)顯示
2.統(tǒng)計emp表中有多少個不重復部門
group by…h(huán)aving分組查詢
group by按照其后的字段分組,可使用多個字段進行分組。通常配合having使用,having后面的條件是對組的約束。同時SELECT子句中的字段必須是分組中的字段或分組函數(shù)
任務實現(xiàn): 查詢emp表平均薪水大于2000的部門編號、平均薪水
任務實現(xiàn):
1.統(tǒng)計獲救與死亡情況
2.統(tǒng)計艙位分布情況
select pclass,count(pclass) from tidanic group by pclass;3.統(tǒng)計港口登船人員分布情況
select embarked,count(embarked) from tidanic group by embarked;5.3、select連接查詢和子查詢
5.3.1、join連接查詢
任務實現(xiàn): 查詢emp表薪水大于2500的員工姓名及所在部門名稱
5.3.2、子查詢
任務實現(xiàn):
1.在emp表中,工資最高的員工姓名、薪水
2.在emp表中,工資高于平均工資員工姓名、薪水
5.3.3、case…when…then查詢
任務實現(xiàn):
查詢emp表中的員工姓名,薪水,如果薪水小于2000標記為low,如果薪水在2000和5000之間標記為middle,如果薪水大于5000標記為high
5.4、任務實現(xiàn):分析影響生存率關系
1.統(tǒng)計各個性別存活數(shù)
select sex,count(*) as sexcount from tidanic where survived=1 group by sex2.計算存活總數(shù)
select count(*) as allcount from tidanic where survived=13.統(tǒng)計性別與生存率的關系
select a.sex,a.sexcount/b.allcount as count from (select sex,count(*) as sexcount from tidanic where survived=1 group by sex) a join (select count(*) as allcount from tidanic where survived=1) b on 1=1;同理:
4.統(tǒng)計客艙等級與生存率的關系
select a.pclass,a.sexcount/b.allcount as count from (select pclass,count(*) as sexcount from tidanic where survived=1 group by pclass) a join (select count(*) as allcount from tidanic where survived=1) b on 1=1;5.統(tǒng)計登船港口與生存率的關系
select a.embarked,a.sexcount/b.allcount as count from (select embarked,count(*) as sexcount from tidanic where survived=1 group by embarked) a join (select count(*) as allcount from tidanic where survived=1) b on 1=1;5.5、Hive語句執(zhí)行順序
任務實現(xiàn):
查詢emp表平均薪水大于2000的部門編號、平均薪水并按照部門編號排序,不包括10部門
可以在執(zhí)行HQL語句前加explain,可查看執(zhí)行順序
SQL執(zhí)行順序
FROM ... WHERE ... GROUP BY ... AVG SUM 等聚合函數(shù) ... HAVING ... SELECT... ORDER BY ...Hive執(zhí)行順序
FROM ... WHERE ... SELECT ... GROUP BY ... HAVING ... ORDER BY ...Hive的執(zhí)行順序也是MapReduce的執(zhí)行順序
map階段:
- 執(zhí)行from加載:進行表的查找與加載
- 執(zhí)行where過濾:進行條件過濾與篩選
- 執(zhí)行select查詢:進行輸出項的篩選
- 執(zhí)行group by分組:描述了分組后需要計算的函數(shù)
- map端文件合并:map端本地溢出寫文件的合并操作,每個map最終形成一個臨時文件。 然后按列映射到對應的reduce階段
reduce階段:
- group by:對map端發(fā)送過來的數(shù)據(jù)進行分組并進行計算。
- Having:最后過濾列用于輸出結果
- order by:排序后進行結果輸出到HDFS文件
總結
以上是生活随笔為你收集整理的学习笔记Hive(五) —— Hive应用(3)—— Hive查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习笔记Hive(四) —— Hive应
- 下一篇: 学习笔记Hive(六) —— Hive开