hive 中的二級分割槽表和動態分割槽表
阿新 • • 發佈:2018-12-27
- 二級分割槽表/管理表:
create table emp_part1(
empno int,
empname string,
empjob string,
mgrno int,
birthday string,
salary float,
bonus float,
deptno int
)
partitioned by (day string,hour string)
row format delimited fields terminated by '\t';
- 增加分割槽
alter table emp_part1 add partition (day ='20170306',hour='0');
- 刪除分割槽
alter table emp_part1 drop partition (day='20170306',hour='0');
load data local inpath '/home/user01/emp.txt' into table emp_part1 partition (day='20170308',hour='9');
load data local inpath '/home/user01/emp.txt' into table emp_part1 partition (day='20170308',hour='10');
load data local inpath '/home/user01/emp.txt' into table emp_part1 partition (day='20170308',hour='14');
load data local inpath '/home/user01/emp.txt' into table emp_part1 partition (day='20170309',hour='10');
- 查詢分割槽資料
select * from emp_part1 where day='20170308'
select * from emp_part1 where day='20170308' and hour='14';
- 查詢所有的分割槽資訊
show partitons emp_part1;
- 分割槽可以理解為分類,通過分類把不同型別,時間,地域的資料放到不同的目錄下。
- 分類的標準就是分割槽欄位,可以一個,也可以多個。
- 分割槽表的意義在於優化查詢。查詢時儘量利用分割槽欄位。如果不使用分割槽欄位,就會全表掃描。 -
- 動態分割槽表:多維度資料處理及查詢 嚴格模式:static partitioned by (county string,states
string) 非嚴格模式:partitioned by (county string,states string) - 需要設定以下引數: //是否開啟動態分割槽功能 0.13版本預設開啟
set hive.exec.dynamic.partition=true;
動態分割槽的模式,預設strict,表示必須指定至少一個分割槽為靜態分割槽,nonstrict模式表示允許所有的分割槽欄位都可以使用動態分割槽
set hive.exec.dynamic.partition.mode=nostrict;
create table dypart(
id int,
name string
)
partitioned by (addr string)
row format delimited fields terminated by '\;';
//使用特殊字元作為分隔符時需要轉義
//動態分割槽必須使用mapreduce才能完成,所以不能使用load方式載入
insert into table dypart partition (addr) select deptno,deptname,addr as addr from dept;
- 二級動態分割槽表
create external table dypart2(
empno int,
empname string,
empjob string,
mgrno int,
birthday string,
salary int,
bonus float,
deptno int
)
partitioned by (country string,province string)
row format delimited fields terminated by '\t'
location '/hive/dynamic/dypart2';
//location之後的目錄可以不存在,建立表會自動建立,但作為外部表推薦目錄和資料已經存在
- 開啟嚴格模式
set hive.exec.dynamic.partition.mode=strict;
- 嚴格模式中,要求主分割槽必須為靜態分割槽,輔助分割槽可以為動態
insert into table dypart2 partition (country='usa',province) select empno,empname,empjob,mgno,birthday,salary,bonus,depno,depno as province from emp;
- 通過子查詢方式
insert into table dypart2 partition (country='usa',province) select c.empno,c.empname,c.empjob,c.mgno,c.birthday,c.salary,c.bonus,c.depno,c.deptname as province from (select * from emp a join dept b on a.depno=b.deptno) c;
- 覆蓋匯入方式,此時overwrite和into不能連用
insert overwrite table dypart2 partition (country='china',province) select a.empno,a.empname,a.empjob,a.mgno,a.birthday,a.salary,a.bonus,a.depno,b.deptname as province from emp a join dept b on a.depno=b.deptno;
- 桶表: 將內部表,外部表和分割槽表進一步組織成桶表 可以將表的列通過Hash演算法進一步分解成不同的檔案儲存
create table test_bucket_table(
id int,
name string,
addr string
)
clustered by (id) into 4 buckets
row format delimited fields terminated by '\|';
`//強制開啟分桶
set hive.enforce.bucketing=true;
insert overwrite table test_bucket_table select * from dept;
`//若沒有使用hive.enforce.bucketing屬性, 則需要設定和分桶個數相匹配的reducer個數, 同時SELECT後新增CLUSTER BY
set mapred.reduce.tasks=4;
insert into table test_bucket_table select * from dept cluster by deptno;