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)