Hive 之 查詢 01-基本查詢、where子句、分組

一、 基本查詢

1.1 全表和特定列查詢(select … from)

1.1.1 全表查詢:

hive (default)> select * from dept;
OK
dept.deptno	dept.dname	dept.loc
10	ACCOUNTING	1700
20	RESEARCH	1800
30	SALES	1900
40	OPERATIONS	1700
Time taken: 0.546 seconds, Fetched: 4 row(s)

1.1.2 特定列查詢:

hive (default)> select dname, loc from dept;
OK
dname	loc
ACCOUNTING	1700
RESEARCH	1800
SALES	1900
OPERATIONS	1700
Time taken: 0.077 seconds, Fetched: 4 row(s)

【注】
○ SQl 語言大小寫不敏感;
○ SQL 可以寫在一行或者多行;
○ 關鍵字不能被縮寫也不能分行寫;
○ 各子句一般要分行寫;
○ 使用縮進提高語句的可讀性;

1.2 列別名

1.2.1 重命名一個列;

1.2.2 便於計算;

1.2.3 緊跟列名, 【也可以】在列名和別名之間加入關鍵字 AS;

如:

hive (default)> select deptno AS dn, dname name from dept;
OK
dn	name
10	ACCOUNTING
20	RESEARCH
30	SALES
40	OPERATIONS
Time taken: 0.07 seconds, Fetched: 4 row(s)

1.3 算數運算符

+ - * / % & | ^ ~分別代表加、 減、 乘、 除、 取餘、 按位與、 按位或、 按位異或、 按位取反;

如:

hive (default)> select * from dept;
OK
dept.deptno	dept.dname	dept.loc
10	ACCOUNTING	1700
20	RESEARCH	1800
30	SALES	1900
40	OPERATIONS	1700
Time taken: 0.079 seconds, Fetched: 4 row(s)

hive (default)> select deptno * 10 dn from dept;
OK
dn
100
200
300
400
Time taken: 0.063 seconds, Fetched: 4 row(s)

1.4 常用函數

count()、 max()、 min()、 sum()、 avg() 分別代表求行數、 最大數、 最小數、 總和、 平均值;

如:

hive (default)> select * from dept;
OK
dept.deptno	dept.dname	dept.loc
10	ACCOUNTING	1700
20	RESEARCH	1800
30	SALES	1900
40	OPERATIONS	1700
Time taken: 0.079 seconds, Fetched: 4 row(s)

hive (default)> select avg(deptno) from dept;

... ...(會啓動 mapreduce)
OK
_c0
25.0
Time taken: 32.158 seconds, Fetched: 1 row(s)

【注】這些函數一定會觸發 MapReduce;

1.5 limit 語句

限制返回來的數據的行數;

如:

hive (default)> select * from dept limit 2;
OK
dept.deptno	dept.dname	dept.loc
10	ACCOUNTING	1700
20	RESEARCH	1800
Time taken: 0.076 seconds, Fetched: 2 row(s)

二、 where 子句

○ 使用 where 子句, 將不滿足條件的行過濾掉;
○ where 子句緊隨 from 子句;

如:

hive (default)> select * from dept where loc > 1700;
OK
dept.deptno	dept.dname	dept.loc
20	RESEARCH	1800
30	SALES	1900
Time taken: 0.112 seconds, Fetched: 2 row(s)

2.1 比較運算符(between、 in、 is Null)

表達式 意義
A=B 等於, A、B 相等返回 true, 否則返回 false;
A<=>B 指向, A、B 均爲 Null 返回 true, 單一爲 Null 返回 false, 其餘同 =;
A<>B A!=B 不等於, 單一爲 Null 返回 Null;
A<B 小於, 單一爲 Null 返回 Null;
A<=B 小於等於, 單一爲 Null 返回 Null;
A>B 大於, 單一爲 Null 返回 Null;
A>=B 大於等於, 單一爲 Null 返回 Null;
A [NOT] between B AND C A 在 [B, C] 則爲 true, 單一爲 Null 返回 Null;
A is Null A 是 Null 返回 true;
A is not Null A不是 Null 返回 true;
A in [數值1, 數值2] A 的值如果在列表中, 返回 true;
A [not] like B 如果 A 與正則表達式 B 匹配, 返回 true;
A rlike B, A regexp B B 是一個 SQL 下的簡單的正則表達式, 如果 A 與其匹配則返回 true; 匹配使用的是 JDK 中的正則表達式接口實現的, 因爲正則也依據其中的規則。 例如, 正則表達式必須與整個字符串 A 相匹配, 而不是隻需與其字符串相匹配;

2.2 like 和 rlike(用的較少)

2.2.1 使用like 運算, 選擇類似的值;

2.2.2 選擇條件可以包含字符或數字;

% 代表任意個字符;
_ 代表一個字符;

2.2.3 rlike 子句是 Hive 中這個功能的一個擴展, 其可以通過 Java 的正則表達式這個更強大的語言來指定匹配條件;

如:

原數據:

hive (default)> select * from dept;
OK
dept.deptno	dept.dname	dept.loc
10	ACCOUNTING	1700
20	RESEARCH	1800
30	SALES	1900
40	OPERATIONS	1700
Time taken: 0.097 seconds, Fetched: 4 row(s)

查詢 loc 以 1 開頭的數據:

hive (default)> select * from dept where loc like '1%';
OK
dept.deptno	dept.dname	dept.loc
10	ACCOUNTING	1700
20	RESEARCH	1800
30	SALES	1900
40	OPERATIONS	1700
Time taken: 0.097 seconds, Fetched: 4 row(s)

查詢 loc 第二位爲 7 的數據:

hive (default)> select * from dept where loc like '_7%';
OK
dept.deptno	dept.dname	dept.loc
10	ACCOUNTING	1700
40	OPERATIONS	1700
Time taken: 0.074 seconds, Fetched: 2 row(s)

查詢 loc 中包含 0 的數據:

hive (default)> select * from dept where loc rlike '[0]';
OK
dept.deptno	dept.dname	dept.loc
10	ACCOUNTING	1700
20	RESEARCH	1800
30	SALES	1900
40	OPERATIONS	1700
Time taken: 0.068 seconds, Fetched: 4 row(s)

2.3 邏輯運算符(and、or、not)

and、 or、 not 分別表示並、 或、 否;

三、 分組

3.1 group by 子句

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

如:

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

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

... ...
OK
t.deptno	avg_sal
10	2916.6666666666665
20	2175.0
30	1566.6666666666667
Time taken: 31.751 seconds, Fetched: 3 row(s)

計算 emp 中每個部門每個崗位的最高薪水:

hive (default)> select t.deptno, t.job, max(sal) max_sal from emp t group by t.deptno, t.job;

... ...
OK
t.deptno	t.job	max_sal
10	CLERK	1300.0
10	MANAGER	2450.0
10	PRESIDENT	5000.0
20	ANALYST	3000.0
20	CLERK	1100.0
20	MANAGER	2975.0
30	CLERK	950.0
30	MANAGER	2850.0
30	SALESMAN	1600.0
Time taken: 22.169 seconds, Fetched: 9 row(s)

3.2 having 語句

having 與where 的不同點:

○ where 針對表中的列發揮作用, 查詢數據; having 針對查詢結果中的列發揮作用, 篩選數據;
○ where 後面不能寫分組函數, 而 having 後面可以使用分組函數;
○ having 只用於 group by 分組統計語句;

如:

求每個部門的平均工資:

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

... ...
OK
deptno	a_sal
10	2916.6666666666665
20	2175.0
30	1566.6666666666667
Time taken: 17.327 seconds, Fetched: 3 row(s)

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

hive (default)> select deptno, avg(sal) a_sal from emp group by deptno having a_sal > 2000;

OK
deptno	a_sal
10	2916.6666666666665
20	2175.0
Time taken: 21.198 seconds, Fetched: 2 row(s)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章