一、ThreadLocal原理分析 1、概念 ThreadLocal類並不是用來解決多線程環境下的共用變數問題,而是用來提供線程內部的共用變數。在多線程環境 下,可以保證各個線程之間的變數互相隔離、相互獨立。 2、核心原理 即:實際上是ThreadLocal的靜態內部類ThreadLocalMap為 ...
第6章 查詢
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select
查詢語句語法:
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT number]
6.1 基本查詢(Select…From)
6.1.1 全表和特定列查詢
0)數據準備
(0)原始數據
dept:
10 ACCOUNTING 1700
20 RESEARCH 1800
30 SALES 1900
40 OPERATIONS 1700
emp:
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
(1)創建部門表
create table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';
(2)創建員工表
create table if not exists emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';
(3)導入數據
load data local inpath '/opt/module/hive/datas/dept.txt' into table dept;
load data local inpath '/opt/module/hive/datas/emp.txt' into table emp;
1)全表查詢
hive (default)> select * from emp;
hive (default)> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp ;
2)選擇特定列查詢
hive (default)> select empno, ename from emp;
註意:
(1)SQL 語言大小寫不敏感。
(2)SQL 可以寫在一行或者多行
(3)關鍵字不能被縮寫也不能分行
(4)各子句一般要分行寫。
(5)使用縮進提高語句的可讀性。
6.1.2 列別名
1)重命名一個列
2)便於計算
3)緊跟列名,也可以在列名和別名之間加入關鍵字‘AS’
4)案例實操
查詢名稱和部門
hive (default)> select ename AS name, deptno dn from emp;
6.1.3 算術運算符
運算符 | 描述 |
---|---|
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顯示。
hive (default)> select sal +1 from emp;
6.1.4 常用函數
1)求總行數(count)
hive (default)> select count(*) cnt from emp;
2)求工資的最大值(max)
hive (default)> select max(sal) max_sal from emp;
3)求工資的最小值(min)
hive (default)> select min(sal) min_sal from emp;
4)求工資的總和(sum)
hive (default)> select sum(sal) sum_sal from emp;
5)求工資的平均值(avg)
hive (default)> select avg(sal) avg_sal from emp;
6.1.5 Limit語句
典型的查詢會返回多行數據。LIMIT子句用於限制返回的行數。
hive (default)> select * from emp limit 5;
hive (default)> select * from emp limit 2,3;
6.1.6 Where語句
1)使用WHERE子句,將不滿足條件的行過濾掉
2)WHERE子句緊隨FROM子句
3)案例實操
查詢出薪水大於1000的所有員工
hive (default)> select * from emp where sal >1000;
註意:where子句中不能使用欄位別名。
6.1.7 比較運算符(Between/In/ Is Null)
1)下麵表中描述了謂詞操作符,這些操作符同樣可以用於JOIN…ON和HAVING語句中。\
操作符 | 支持的數據類型 | 描述 |
---|---|---|
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相匹配,而不是只需與其字元串匹配。 |
2)案例實操
(1)查詢出薪水等於5000的所有員工
hive (default)> select * from emp where sal =5000;
(2)查詢工資在500到1000的員工信息
hive (default)> select * from emp where sal between 500 and 1000;
(3)查詢comm為空的所有員工信息
hive (default)> select * from emp where comm is null;
(4)查詢工資是1500或5000的員工信息
hive (default)> select * from emp where sal IN (1500, 5000);
6.1.8 Like和RLike
1)使用LIKE運算選擇類似的值
2)選擇條件可以包含字元或數字:
- % 代表零個或多個字元(任意個字元)。
- _ 代表一個字元。
3)RLIKE子句
RLIKE子句是Hive中這個功能的一個擴展,其可以通過Java的正則表達式這個更強大的語言來指定匹配條件。
4)案例實操
(1)查找名字以A開頭的員工信息
hive (default)> select * from emp where ename LIKE 'A%';
(2)查找名字中第二個字母為A的員工信息
hive (default)> select * from emp where ename LIKE '_A%';
(3)查找名字中帶有A的員工信息
hive (default)> select * from emp where ename RLIKE '[A]';
6.1.9 邏輯運算符(And/Or/Not)
操作符 | 含義 |
---|---|
AND | 邏輯並 |
OR | 邏輯或 |
NOT | 邏輯否 |
1)案例實操
(1)查詢薪水大於1000,部門是30
hive (default)> select * from emp where sal>1000 and deptno=30;
(2)查詢薪水大於1000,或者部門是30
hive (default)> select * from emp where sal>1000 or deptno=30;
(3)查詢除了20部門和30部門以外的員工信息
hive (default)> select * from emp where deptno not IN(30, 20);
6.2 分組
6.2.1 Group By語句
GROUP BY語句通常會和聚合函數一起使用,按照一個或者多個列隊結果進行分組,然後對每個組執行聚合操作。
1)案例實操:
(1)計算emp表每個部門的平均工資
hive (default)> select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;
(2)計算emp每個部門中每個崗位的最高薪水
hive (default)> select t.deptno, t.job, max(t.sal) max_sal from emp t group by
t.deptno, t.job;
6.2.2 Having語句
1)having與where不同點\
(1)where後面不能寫分組函數,而having後面可以使用分組函數。
(2)having只用於group by分組統計語句。
2)案例實操\
(1)求每個部門的平均薪水大於2000的部門
求每個部門的平均工資
hive (default)> select deptno, avg(sal) from emp group by deptno;
求每個部門的平均薪水大於2000的部門
hive (default)> select deptno, avg(sal) avg_sal from emp group by deptno having
avg_sal > 2000;
IT學習網站
大數據高薪訓練營 完結
鏈接:https://pan.baidu.com/s/1ssRD-BYOiiMw30EV_BLMWQ
提取碼:dghu
失效加V:x923713