SELECT:
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
] [
LIMIT number]
order by 會對輸入做全局排序,因此只有一個reducer,會導致當輸入規模較大時,需要較長的計算時間。
sort by 不是全局排序,其在數據進入reducer前完成排序,因此,如果用sort by進行排序,並且設置 mapred.reduce.task>1
則sort by 只能保證每個reducer的輸出有序,不保證全局有序。
distribute by(字段) 根據指定的字段將數據分到不同的reducer,且分發算法是hash散列。
cluster by(字段) 除了具有distribute by的功能外,還會對該字段進行排序、
因此,如果distribute和sort字段是同一個時,此時,cluster by = distribute by + sort by
查詢語法:
全表查詢:
select * from score;
選擇特定的列:
select s_id, c_id from score;
列別名:
重命名一個列,便於計算,緊跟列名,也可以在列名和別名直接加入關鍵字 AS
select s_id , as myid, c_id from score;
常用函數:
求總行數:
select count(1) from score;
求分數的最大值:
select max(s_score) from score;
求分數的最小值:
select min(s_score) from score;
求分數的總和:
select sum(s_score) from score;求分數的平均值:
select avg(s_score) from score;
Limit 語句:
select * from score limit3;
Where語句:
使用where子句,將不滿足條件的行過濾掉
where子句緊隨from子句
案例實操:
查詢出分數大於60的數據。
select * from score where s_score > 60;
比較運算符:
查詢分數等於80的所有的數據:
select * from score where s_score = 80;
查詢分數在80到100的所有數據:
select * from score where s_score between 80 and 100;
查詢成績爲空的所有數據:
select * from score where s_score is null;
查詢成績是80和90的數據:
select * from score where s_score in (80,90);
Like 和 Rlike
使用LIKE運算選擇類似的值
選擇條件可以包含字符或數字
% 代表零個或多個字符(任意個字符)
_ 代表一個字符
RLike 子句是Hive中這個功能的一個擴展,其可以通過java的正則表達式這個更強大的語言來指定匹配條件。
案例實操:
查詢以8開頭的所有成績:
select * from score where s_score like '8%';
查詢第二個數值爲9的所有成績數據:
select * from score where s_score like '_9%';
查找s_id中含1的數據:
select * from score where s_id rlike '[1]'; # like '%1%';
邏輯運算符:
分組:
Group By 語句:
Group By 語句通常會和聚合函數一起使用,按照一個或者多個隊列結果進行分組,然後對每個組執行聚合操作。
計算每個學生的平均分數:
select s_id, avg(s_score) from score group by s_id;
計算每個學生的最高成績:
select s_id , max (s_score) from score group by s_id;
HAVING語句:
having 與where 不同點:
- where 針對表中的列發揮作用,查詢數據;having針對查詢結果中的列發揮作用,篩選數據
- where 後面不能寫分組函數,而having後面可以使用分組函數。
- having只用於group by 分組統計語句
案例實操:
求每個學生的平均分數:
select s_id , avg(s_score) from score group by s_id;
求每個學生平均分數大於85 的人
select s_id, avg(s_score) avgscore from score group by s_id having avgscore > 85;
JOIN語句:
等值JOIN
hive支持通常的SQL JOIN 語句,但是隻支持等值連接,不支持非等值連接。
案例操作:查詢分數對應的姓名:
select s.s_id , s.s_score ,stu.s_name,stu.s_birth from score s join student stu on s.s_id = stu.s_id;
內連接:
內連接:只有進行連接的兩個表中都存在於連接條件相匹配的數據纔會被保留下來。
select * from teacher t inner join course c on t.t_id = c.t_id;
左外連接:
左外連接: JOIN操作符左邊表符合where 子句的所有記錄將會被返回,查詢老師對應的課程
select * from teacher t left join course c on t.t_id = c.t_id;
右外連接:
右外連接: JOIN操作符右邊表中符合WHERE子句的所有記錄將會被返回。
select * from teacher t right join course c on t.t_id = c.t_id;
多表連接:
注意: 連接n個表,至少需要n-1 個連接條件。例如:連接三個表,至少需要兩個連接條件。
多表連接查詢。查詢老師對應的課程,以及對應的分數,對應的學生。
select * from teacher t left join course c on t.t_id = c.t_id left join score s on s.c_id = c.c_id
left join student stu on s.s_id = stu.s_id;
大多數情況下,Hive會對每對JOIN連接對象啓動一個MapReduce任務。本例中會首先啓動一個
MapReduce job對錶techer和表course進行連接操作,然後會再啓動一個MapReduce job將第一
個MapReduce job的輸出和表score;進行連接操作。
排序:
全局排序: Order by 全局排序 , 一個reduce
- 使用ORDER BY 子句 排序 ASC (ascend): 升序(默認) DESC (descend) : 降序
- ORDER BY 子句 在SELECT 語句的結尾
查詢學生的成績,並按照分數降序排列
select * from student s left join score sco on s.s_id = sco.s_id order by sco.s_score DESC;
查詢學生的成績,並按照分數升序排列:
select * from student s left join score sco on s.s_id = sco.s_id order by sco.score asc;
按照分數的平均值排序:
select s_id , avg(s_score) avg from score group by s_id order by avg;
多個列排序:
select s_id ,avg(s_score) avg from score group by s_id order by s_id,avg;
每個MapReduce 內部排序 Score By 局部 排序。Scort By: 每個MapReduce 內部進行排序,對全局結果集來說不是排序
設置reduce 個數:
set mapreduce.job.reduces = 3;
1. 查看設置reduce 個數
set mapreduce.job.reduces;
1.查詢成績按照成績降序排列:
select * from score sort by s_score;
1.查詢結果導入到文件中(按照成績降序排列)
insert overwrite local directory '/export/servers/hivedatas/sort' select * from score sort by s_score;
分區排序(DISTRIBUTE BY):
Distribute By: 類似MR 中partition ,進行分區,結合sort by 使用;
注意,Hive 要求DISTRIBUTE BY 語句要寫在SORT BY 語句之前
對於distribute by進行測試,一定要分配多reduce進行處理,否則無法看到distribute by的效
果。
案例實操:先按照學生id進行分區,再按照學生成績進行排序。
1. 設置reduce的個數,將我們對應的s_id劃分到對應的reduce當中去
set mapreduce.job.reduces=7;2.通過distribute by 進行數據的分區
insert overwrite local directory '/export/servers/hivedatas/sort' select *
from score distribute by s_id sort by s_score;
CLUSTER BY:
當distribute by 和sort by 字段相同時,可以使用cluster by 方式。
cluster by 除了具有distribute by 的功能外還兼具sort by 的功能,但是排序只能是倒序排序,不能指定排序規則 爲ASC 或者DESC;
以下兩種寫法等價:
select * from score cluster by s_id;
select * from score distribute by s_id sort by s_id;