1. 程式人生 > 實用技巧 >Hive(五)【DQL資料查詢】

Hive(五)【DQL資料查詢】

目錄

一. 基本查詢

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;