Hive(五)【DQL資料查詢】
阿新 • • 發佈:2020-06-28
目錄
一. 基本查詢
1.1 算數運算子
運算子 | 描述 |
---|---|
A+B | A和B 相加 |
A-B | A減去B |
A*B | A和B 相乘 |
A/B | A除以B |
A%B | A對B取餘 |
A&B | A和B按位取與 |
A|B | A和B按位取或 |
A^B | A和B按位取異或 |
~A | A按位取反 |
案例
查詢所有員工的薪水然後加1
select sal+1 from emp
1.2 常用聚合函式
可以和分組group by 配合使用
案例
求總行數、最大值、最小值、總和、平均值
select count(*),max(sal),min(sal),sum(sal),avg(sal) from emp
1.3 limit
案例
查詢emp表前五行
select * from emp limit 5;
查詢emp表第5-第10行
select * from emp limit 4,6;
--資料從第0行開始計數,4代表第5行,6代表從第5行往後再查6行
1.4 where
注意:where字句緊隨from字句、where字句不能使用欄位別名
1.5 比較運算子(between|in|is null)
操作符 | 支援的資料型別 | 描述 |
---|---|---|
A=B | 基本資料型別 | 如果A等於B則返回TRUE,反之返回FALSE |
A<=>B | 基本資料型別 | 如果A和B都為NULL,則返回TRUE,如果一邊為NULL,返回False |
A<>B, A!=B | 基本資料型別 | A或者B為NULL則返回NULL;如果A不等於B,則返回TRUE,反之返回FALSE |
A<B | 基本資料型別 | A或者B為NULL,則返回NULL;如果A小於B,則返回TRUE,反之返回FALSE |
A<=B | 基本資料型別 | A或者B為NULL,則返回NULL;如果A小於等於B,則返回TRUE,反之返回FALSE |
A>B | 基本資料型別 | A或者B為NULL,則返回NULL;如果A大於B,則返回TRUE,反之返回FALSE |
A>=B | 基本資料型別 | A或者B為NULL,則返回NULL;如果A大於等於B,則返回TRUE,反之返回FALSE |
A [NOT] BETWEEN B AND C | 基本資料型別 | 如果A,B或者C任一為NULL,則結果為NULL。如果A的值大於等於B而且小於或等於C,則結果為TRUE,反之為FALSE。如果使用NOT關鍵字則可達到相反的效果。 |
A IS NULL | 所有資料型別 | 如果A等於NULL,則返回TRUE,反之返回FALSE |
A IS NOT NULL | 所有資料型別 | 如果A不等於NULL,則返回TRUE,反之返回FALSE |
IN(數值1, 數值2) | 所有資料型別 | 使用 IN運算顯示列表中的值 |
A [NOT] LIKE B | STRING 型別 | B是一個SQL下的簡單正則表示式,也叫萬用字元模式,如果A與其匹配的話,則返回TRUE;反之返回FALSE。B的表示式說明如下:‘x%’表示A必須以字母‘x’開頭,‘%x’表示A必須以字母’x’結尾,而‘%x%’表示A包含有字母’x’,可以位於開頭,結尾或者字串中間。如果使用NOT關鍵字則可達到相反的效果。 |
A RLIKE B, A REGEXP B | STRING 型別 | B是基於java的正則表示式,如果A與其匹配,則返回TRUE;反之返回FALSE。匹配使用的是JDK中的正則表示式介面實現的,因為正則也依據其中的規則。例如,正則表示式必須和整個字串A相匹配,而不是隻需與其字串匹配。 |
1.6 LIKE和RLIKE
-
LIKE
%代表任意個字元
_ 代表一個字元
-
RLIKE
RLIKE子句是Hive中這個功能的一個擴充套件,其可以通過Java的正則表示式這個更強大的語言來指定匹配條件。
案例
1.查詢以A開頭的員工資訊
select * from emp where ename LIKE 'A%'; --LIKE
select * from emp where ename RLIKE '^A'; --RLIKE
2.查詢名字第二個字母為A的員工資訊
select * from emp where ename LIKE '_A%';
select * from emp where ename RLIKE '^.A';
3.查詢名字中帶A的員工資訊
select * from emp where ename LIKE '%A%';
select * from emp where ename RLIKE '[A]';
1.7 and|or|not
操作符 | 含義 |
---|---|
AND | 邏輯並 |
OR | 邏輯或 |
NOT | 邏輯否 |
1.8 group by|having by
(1)where 後面不能寫分組函式,having後面可以使用分組函式。
(2)having只能於group by分組統計語句。
二. Join語句
2.1 內連線
案例
select e.empno,e.ename,d.deptno from emp e join dept d on e.deptno = d.deptno;
2.2 外連線(左|右)
案例
-
左外連線
select e.empno,e.ename,d.deptno from emp e left join dept d on e.deptno = d.deptno;
-
右外連線
select e.empno,e.ename,d.deptno from emp e left join dept d on e.deptno = d.deptno;
2.3 滿連線
案例
select e.deptno,e.ename,d.deptno from emp e
full join deptno d on e.depno=d.depno;
2.4 多表連線
案例
select * from emp e
join dept d
on e.deptno = d.deptno
join location l
on d.loc = l.loc;
三. 排序
3.1 order by
全域性排序,只有一個reducer。對於大資料場景的資料效率非常低,一般不用
別名、多個列全排序
案例
select ename,deptno,sal*2 two_sal from emp order bydeptno asc,two_sal desc;
3.2 sort by 和 distribute by
sort by
sort by為每個reducer進行內部排序(區內排序),對全域性不是排序。
distribute by
distribute by的分割槽規則是根據分割槽欄位的hash碼與reduce的個數進行模除後,餘數相同的分到一個區
案例
insert overwrite local directory '/opt/module/hive/data/export'
select * from emp distribute by deptno sort by empno desc;
總結
一般sort by和distribute by一起使用,Hive要求distribute by語句要寫sort by語句之前
引數設定:set mapreduce.job.reduces=3,set mapreduce.job.reduces
3.3 cluster by
cluster by可以看做是sort by和distribute by相同欄位一起使用的特例。
cluster by具有distribute by的功能外還兼具sort by的功能,但是排序只能是升序排序。
案例
select * from emp cluster by deptno;
--上下兩種寫法等價
select * from emp distribute by deptno sort by deptno;