您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“hive分區和分桶的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“hive分區和分桶的示例分析”這篇文章吧。
當單個表數據量越來越大的時候,hive查詢通常會全表掃描,這將會浪費我們不關心數據的掃描,浪費大量時間。從而hive引出分區概念partition
看具體業務,能把一堆數據拆分成多個堆的數據就可以。 通常使用id 、 年 、 月 、天 、區域 、省份、 hive分區和mysql分區的區別?? mysql的分區字段采用的表內字段。 hive的分區字段使用的是表外字段。
1、分區本質是在該表下創建對應的目錄。 2、分區名大小寫不區分,建議不要使用中文。 3、可以查詢分區信息。但是我們的分區字段相當于是一個偽字段,在元數據中存在,但是不真實存在數據內容中。
4、加載數據時要指定分區
創建一級分區表:
create table if not exists day_part(
uid int,
uname string
)
partitioned by(year int)
row format delimited fields terminated by '\t'
;
load data local inpath '/root/Desktop/student.txt' into table day_part partition(year=2017);
load data local inpath '/root/Desktop/score.txt' into table day_part partition(year=2016);
show partitions day_part;
二級分區
create table if not exists day_part1(
uid int,
uname string
)
partitioned by(year int,month int)
row format delimited fields terminated by '\t'
;
load data local inpath '/root/Desktop/student.txt' into table day_part1 partition(year=2017,month=04);
load data local inpath '/root/Desktop/score.txt' into table day_part1 partition(year=2017,month=03);
三級分區:
create table if not exists day_part2(
uid int,
uname string
)
partitioned by(year int,month int,day int)
row format delimited fields terminated by '\t'
;
對分區進行操作: 顯示分區:
show partitions day_part;
新增分區:空的
alter table day_part1 add partition(year=2017,month=2);
alter table day_part1 add partition(year=2017,month=1) partition(year=2016,month=12);
新增分區并加載數據:
alter table day_part1 add partition(year=2016,month=11) location "/user/hive/warehouse/qf1603.db/day_part1/year=2017/month=2";
修改分區所對應的存儲路徑:
##路徑必須從hdfs寫起
alter table day_part1 partition(year=2016,month=11) set location "hdfs://linux1:9000/user/hive/warehouse/qf1603.db/day_part1/year=2017/month=3";
刪除分區:刪除分區將會刪除對應的分區目錄(數據)
##刪除某個分區
alter table day_part1 drop partition(year=2017,month=2);
##刪除多個
alter table day_part1 drop partition(year=2017,month=3),partition(year=2017,month=4);
靜態分區、動態分區、混合分區 靜態分區:新增分區或者是加載分區數據時,已經指定分區名。 動態分區:新增分區或者是加載分區數據時,分區名未知。 混合分區:靜態分區和動態分區同時存在。
動態分區的相關屬性: hive.exec.dynamic.partition=true :是否允許動態分區 hive.exec.dynamic.partition.mode=strict :分區模式設置nostrict strict:最少需要有一個是靜態分區 nostrict:可以全部是動態分區 hive.exec.max.dynamic.partitions=1000 :允許動態分區的最大數量 hive.exec.max.dynamic.partitions.pernode =100 :單個節點上的mapper/reducer允許創建的最大分區
創建臨時表:
##創建臨時表
create table if not exists tmp(
uid int,
commentid bigint,
recommentid bigint,
year int,
month int,
day int
)
row format delimited fields terminated by '\t';
##加載數據
load data local inpath '/root/Desktop/comm' into table tmp;
創建動態分區:
##創建動態分區表
create table if not exists dyp1(
uid int,
commentid bigint,
recommentid bigint
)
partitioned by(year int,month int,day int)
row format delimited fields terminated by '\t'
;
為動態分區加載數據:
##嚴格模式
insert into table dyp1 partition(year=2016,month,day)
select uid,commentid,recommentid,month,day from tmp;
##非嚴格模式
##設置非嚴格模式動態分區
set hive.exec.dynamic.partition.mode=nostrict;
##創建動態分區表
create table if not exists dyp2(
uid int,
commentid bigint,
recommentid bigint
)
partitioned by(year int,month int,day int)
row format delimited fields terminated by '\t';
##為非嚴格模式動態分區加載數據
insert into table dyp2 partition(year,month,day)
select uid,commentid,recommentid,year,month,day from tmp;
hive提供我們一個嚴格模式:為了阻止用戶不小心提交惡意hql hive.mapred.mode=nostrict : strict
如果該模式值為strict,將會阻止以下三種查詢: 1、對分區表查詢,where中過濾字段不是分區字段。 2、笛卡爾積join查詢,join查詢語句,不帶on條件 或者 where條件。
select
stu.id,
stu.name,
score.grade
from student stu
join score
;
可以:
select
stu.id,
stu.name,
score.grade
from student stu
join score
where stu.id = score.uid
;
3、對order by查詢,有order by的查詢不帶limit語句。
select
student.*
from student
order by student.id desc
;
注意: 1、盡量不要是用動態分區,因為動態分區的時候,將會為每一個分區分配reducer數量,當分區數量多的時候,reducer數量將會增加,對服務器是一種災難。 2、動態分區和靜態分區的區別,靜態分區不管有沒有數據都將會創建該分區,動態分區是有結果集將創建,否則不創建。 3、hive動態分區的嚴格模式和hive提供的hive.mapred.mode的嚴格模式。
分區數據依然很大,對分區數據或者表數據更加細粒度的管理。 分桶關鍵字: clustered by(uid) into n buckets 、bucket 、 分桶使用表內字段 怎么分桶?? 對分桶字段進行hash值,然后將hash值模于總的桶數,然后得到桶數
1、快速抽樣查詢。tablesample 2、減少查詢掃描數據量,提高查詢效率。
##創建分桶表,設置4個分桶
create table if not exists bucket1(
uid int,
uname String
)
clustered by(uid) into 4 buckets
row format delimited fields terminated by '\t'
;
為分桶表加載數據: 分桶不能使用load方式來加載數據,而需要iinsert into方式來加載 并且需要設置屬性:
##設置分桶啟用
hive> set hive.enforce.bucketing=true;
##錯誤的加載數據方式
load data local inpath '/root/Desktop/student' into table bucket1;
##創建分桶表,設置4個分桶
create table if not exists bucket7(
uid int,
uname String
)
clustered by(uid) into 4 buckets
row format delimited fields terminated by '\t'
;
##為分桶表加載數據
insert into table bucket7
select id,name from student
;
分桶查詢:tablesample(bucket x out of y on uid) 注意:x不能大于y x:所取桶的起始位置, y:所取桶的總數,y是總桶數的因子。y大于源總桶數相當于拉伸,y小于源總桶數相當于壓縮 1 out of 2 1 1+4/2 2 out of 2 2 2+4/2
1 out of 4 1 1+4
select * from bucket7;
select * from bucket7 tablesample(bucket 1 out of 4 on uid);
select * from bucket7 tablesample(bucket 2 out of 4 on uid);
select * from bucket7 tablesample(bucket 1 out of 2 on uid);
select * from bucket7 tablesample(bucket 2 out of 2 on uid);
select * from bucket7 tablesample(bucket 3 out of 2 on uid);
select * from bucket7 tablesample(bucket 1 out of 8 on uid);
select * from bucket7 tablesample(bucket 5 out of 8 on uid);
分區+分桶:(qfstu) uid,uname,class,master gender分區 分桶uid 基偶分桶 查詢女生中的學號為基數??
##創建表
create table if not exists qftmp(
uid int,
uname string,
class int,
gender int)
row format delimited fields terminated by '\t';
##加載數據
load data local inpath '/home/qf' into table qftmp;
##創建動態分區分桶表
create table if not exists qf(
uid int,
uname string,
class int)
partitioned by(gender int)
clustered by(uid) into 2 buckets
row format delimited fields terminated by '\t';
##為動態分區分桶表加載數據
insert into table qf partition(gender)
select uid,uname,class,gender from qftmp;
查詢女生中的學號為基數?????
select * from qf where gender = 2 and uid%2 != 0;
select * from qf tablesample(bucket 2 out of 2 on uid) where gender = 2;
分桶使用內部關鍵字,分區使用的是外部字段。 兩者都是對hive的一個優化。 分區和分桶的數量都要合理設置,不是越多越好。
抽樣:
select * from student order by rand() limit 3;
select * from student limit 3;
select * from student tablesample(3 rows);
select * from student tablesample(20B); ##最小單位是B
select * from student tablesample(20 percent);##百分比
以上是“hive分區和分桶的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。