1. 程式人生 > >Hive中查詢語句

Hive中查詢語句

查詢語句

常用函式

求總行數(count)

hive (default)> select count(*) cnt from emp;

求工資的最大值(max)

hive (default)> select max(sal) max_sal from emp;

求工資的最小值(min)

hive (default)> select min(sal) min_sal from emp;

求工資的總和(sum)

hive (default)> select sum(sal) sum_sal from emp;

求工資的平均值(avg)

hive (default)> select avg(sal) avg_sal from emp;

Limit語句典型的查詢會返回多行資料。LIMIT子句用於限制返回的行數。

hive (default)> select * from emp limit 5;

分組

group by語句通常會和聚合函式一起使用,按照一個或者多個列隊結果進行分組,然後對每個組執行聚合操作

計算emp表每個部門的平均工資

hive (hive)> select avg(sal) avg_sal, deptno from emp group by deptno;

計算emp表每個部分中每個崗位的最高薪水

select deptno,job,max(sal) max_sal from emp group by deptno, job;

having:

having和where不同點

1.where針對表中列發揮作用,查詢資料,Having針對查詢結果中的列發揮作用,篩選資料
2. where後面不能寫分組函式,而having後面可以使用分組函式
3. having只用於group by分組統計語句

求每個部門的平均薪水大於2000的部門

select deptno,avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;

jion語句

等值join

Hive只支援等值連線,不支援非等值連線

根據員工表和部門表中的部門編號相等,查詢員工編號,員工名稱,部門編號

hive (hive)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;

e.empno	e.ename	d.deptno
7369	SMITH	20
499	ALLEN	30
7521	WARD	30
7566	JONES	20

表的別名

好處

使用別名可以簡化查詢,表名字首,提高執行效率

內連線

只進行連線的兩個表中都存在於連線條件相匹配的資料才會被保留下來

案例如等值join

左外連線

jion操作符左邊表中符合where子句的所有記錄將會被返回

select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno;

右外連線

jion 操作符右邊表中符合where子句的所有記錄將會被返回

select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;

滿外連線

將所有表中符合where語句條件的所有記錄,

如果任一表中的指定欄位沒有符合條件的值的話,用null替代

select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;

多表連線

連線n個表,至少需要n-1個條件,例如,連線三個表,至少需要兩個連線條件

資料來源

1700 Beijing
1800 London
1900 Tokyo

建立位置表

hive (hive)> create table location(loc int,loc_name string) row format delimited fields terminated by '\t

載入資料

hive (hive)> load data local inpath '/opt/datas/location.txt' into table location;

多表連線查詢

hive (hive)> select e.ename,d.deptno,l.loc_name from emp e join dept d on d.deptno = e.deptno join location l on l.loc = d.loc;

結果

e.ename d.deptno l.loc_name
SMITH 20 London
ALLEN 30 Tokyo
WARD 30 Tokyo
JONES 20 London
MARTIN 30 Tokyo
BLAKE 30 Tokyo
CLARK 10 Beijing
SCOTT 20 London
KING 10 Beijing
TURNER 30 Tokyo
ADAMS 20 London
JAMES 30 Tokyo
FORD 20 London
MILLER 10 Beijing

大多數情況下,Hive會對每對JOIN連線物件啟動一個MapReduce任務。本例中會首先啟動一個MapReduce job對錶e和表d進行連線操作,然後會再啟動一個MapReduce job將第一個MapReduce job的輸出和表l;進行連線操作。
注意:為什麼不是表d和表l先進行連線操作呢?這是因為Hive總是按照從左到右的順序執行的。

笛卡爾積

出現場景

1.省略連線條件
2.連線條件無效
3.所有表中的所有行互相連線