1. 程式人生 > >hive分桶,排序,連線

hive分桶,排序,連線

連線

1)等值連線
根據員工表和部門表中部門編號相等,查詢員工編號、員工名、部門名稱
select e.empno,e.ename,d.dept from empt e join dept d on e.deptno=d.deptn
o;
2)左連線(左邊的資料比右邊大,對應找不到的資料就為Null)
select e.empno,e.ename,d.dept from empt e left join dept d on e.deptno=d.
deptno;
3)右連線(右邊的資料比左邊大,對應找不到的資料就為Null)
select e.empno,e.ename,d.dept from dept d right join empt e on e.deptno=
d.deptno;
4)多表連線查詢
查詢員工名字、部門名稱、員工地址
select e.ename,d.dept,l.loc_name from empt e join dept d on

e.deptno=d.de
ptno join location l on d.loc = l.loc_no;
(5)笛卡爾積
為了避免笛卡爾積採用設定為嚴格模式
set hive.mapred.mode;
set hive.mapred.mode=strict;
設定屬性hive.mapred.mode 為strict能夠阻止以下三種類型的查詢:
1、 除非在where語段中包含了分割槽過濾,否則不能查詢分割槽了的表。這是因為分割槽表通常儲存的資料量都比較大,沒有限定分割槽查詢會掃描所有分割槽,耗費很多資源。
Table: logs(…) partitioned by (day int);
不允許:select *from logs;
允許:select *from logs where day=20151212;
2、 包含order by,但沒有limit子句的查詢。因為orderby 會將所有的結果傳送給單個reducer來執行排序,這樣的排序很耗時。
3、 笛卡爾乘積;

排序

(1)全域性排序order by
查詢員工資訊按照工資升序排列
select * from empt order by sal asc;預設
select * from empt order by sal desc;降序
(2) 查詢員工號與員工薪水按照員工二倍工資排序
select empt.empno,empt.sal*2 two2sal from empt order by two2sal;
(3)分割槽排序
select * from empt distribute by deptno sort by empno desc;

分桶

分割槽表分的是資料的儲存路徑
分桶針對資料檔案
(1)建立分桶表
create table emp_buck(id int,name string)
clustered by(id) into 4 buckets
row format
delimited fields
terminated by ‘\t’;
(2)設定屬性
set hive.enforce.bucketing=true;
(3)匯入資料
insert into table emp_buck select * from emp_b;
這裡基本只能用子查詢的方式來匯入,因為需要進行mr,hash
注意:分割槽分的是資料夾 分桶是分的檔案

資料分桶的適用場景:

分割槽提供了一個隔離資料和優化查詢的便利方式,不過並非所有的資料都可形成合理的分割槽。
尤其是需要確定合適大小的分區劃分方式,(不合理的資料分區劃分方式可能導致有的分割槽資料過多,而某些分割槽沒有什麼資料的尷尬情況)
試試分桶是將資料集分解為更容易管理的若干部分的另一種技術。

比如 抽樣測試