Hive-查詢
1、基本查詢(Select…From)
1.1、基本查詢
全表查詢: hive (default)> select * from emp;
選擇特定列查詢: hive (default)> select empno, ename from emp;
列別名:hive (default)> select ename AS name, deptno dn from emp;
1.2、算術運算子
如:hive (default)> select sal +1 from emp;
1.3、常用函式
1.4、Limit 語句
典型的查詢會返回多行資料。LIMIT 子句用於限制返回的行數。
hive (default)> select * from emp limit 5;
2、Where 語句
2.1、比較運算子(Between/In/ Is Null)
案例實操 :
(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);
2.2、Like 和 RLike
1)使用 LIKE 運算選擇類似的值
2)選擇條件可以包含字元或數字: % 代表零個或多個字元(任意個字元)。 _ 代表一個字元。
3)RLIKE 子句是 Hive 中這個功能的一個擴充套件,其可以通過 Java 的正則表示式這個更強大 的語言來指定匹配條件。
4)案例實操
(1)查詢以 2 開頭薪水的員工資訊
hive (default)> select * from emp where sal LIKE '2%';
(2)查詢第二個數值為 2 的薪水的員工資訊
hive (default)> select * from emp where sal LIKE '_2%';
(3)查詢薪水中含有 2 的員工資訊
hive (default)> select * from emp where sal RLIKE '[2]';
2.3、邏輯運算子(And/Or/Not)
案例實操
(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);
3、分組
3.1、Group By 語句
GROUP BY 語句通常會和聚合函式一起使用,按照一個或者多個列隊結果進行分組, 然後對每個組執行聚合操作。
案例實操:
(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;
3.2、Having 語句
案例實操:
(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;
4、Join 語句
4.1、等值 Join
(1)根據員工表和部門表中的部門編號相等,查詢員工編號、員工名稱和部門編號;
hive (default)> select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;
4.2、表的別名
合併員工表和部門表
hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;
4.3、內連線
內連線:只有進行連線的兩個表中都存在與連線條件相匹配的資料才會被保留下來。
hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;
4.4、左外連線
左外連線:JOIN 操作符左邊表中符合 WHERE 子句的所有記錄將會被返回。
hive (default)> select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno;
4.5、右外連線
右外連線:JOIN 操作符右邊表中符合 WHERE 子句的所有記錄將會被返回。
hive (default)> select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;
4.6、滿外連線
滿外連線:將會返回所有表中符合 WHERE 語句條件的所有記錄。如果任一表的指定 欄位沒有符合條件的值的話,那麼就使用 NULL 值替代。
hive (default)> select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;
4.7、多表連線
hive (default)>SELECT e.ename, d.deptno, l. loc_name FROM emp e JOIN dept d ON d.deptno = e.deptno JOIN location l ON d.loc = l.loc;
4.8、笛卡爾積
hive (default)> select empno, deptno from emp, dept;
4.9、連線謂詞中不支援 or
hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno or e.ename=d.ename;
錯誤的
5、排序
5.1、全域性排序(Order By)
(1)查詢員工資訊按工資升序排列
hive (default)> select * from emp order by sal;
(2)查詢員工資訊按工資降序排列
hive (default)> select * from emp order by sal desc;
5.2、按照別名排序
按照員工薪水的 2 倍排序
hive (default)> select ename, sal*2 twosal from emp order by twosal;
5.3、多個列排序
按照部門和工資升序排序
hive (default)> select ename, deptno, sal from emp order by deptno, sal ;
5.4、每個 MapReduce 內部排序(Sort By)
Sort By:每個 MapReduce 內部進行排序,對全域性結果集來說不是排序。
1)設定 reduce 個數
hive (default)> set mapreduce.job.reduces=3;
2)檢視設定 reduce 個數
hive (default)> set mapreduce.job.reduces;
3)根據部門編號降序檢視員工資訊
hive (default)> select * from emp sort by empno desc;
4)將查詢結果匯入到檔案中(按照部門編號降序排序)
hive (default)> insert overwrite local directory '/opt/module/datas/sortby-result' select * from emp sort by deptno desc;
5.5、分割槽排序(Distribute By)
Distribute By:類似 MR 中 partition,進行分割槽,結合 sort by 使用。
注意,Hive 要求 DISTRIBUTE BY 語句要寫在 SORT BY 語句之前。
對於 distribute by 進行測試,一定要分配多 reduce 進行處理,否則無法看到 distribute by 的效果。
案例實操:
(1)先按照部門編號分割槽,再按照員工編號降序排序。
hive (default)> set mapreduce.job.reduces=3;
hive (default)> insert overwrite local directory '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;
5.6、Cluster By
當 distribute by 和 sorts by 欄位相同時,可以使用 cluster by 方式。
cluster by 除了具有 distribute by 的功能外還兼具 sort by 的功能。但是排序只能是倒序排 序,不能指定排序規則為 ASC 或者 DESC。
1)以下兩種寫法等價
select * from emp cluster by deptno;
select * from emp distribute by deptno sort by deptno;
注意:按照部門編號分割槽,不一定就是固定死的數值,可以是 20 號和 30 號部門分到一 個分割槽裡面去。