91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

hive分區和分桶的示例分析

發布時間:2021-12-10 14:54:19 來源:億速云 閱讀:271 作者:小新 欄目:大數據

這篇文章主要為大家展示了“hive分區和分桶的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“hive分區和分桶的示例分析”這篇文章吧。

1.為什么要分區??

當單個表數據量越來越大的時候,hive查詢通常會全表掃描,這將會浪費我們不關心數據的掃描,浪費大量時間。從而hive引出分區概念partition

2.怎么分區??

看具體業務,能把一堆數據拆分成多個堆的數據就可以。 通常使用id 、 年 、 月 、天 、區域 、省份、 hive分區和mysql分區的區別?? mysql的分區字段采用的表內字段。 hive的分區字段使用的是表外字段。

3.hive分區細節??

1、分區本質是在該表下創建對應的目錄。 2、分區名大小寫不區分,建議不要使用中文。 3、可以查詢分區信息。但是我們的分區字段相當于是一個偽字段,在元數據中存在,但是不真實存在數據內容中。

4、加載數據時要指定分區

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的嚴格模式。

分桶

1.為什么要分桶??

分區數據依然很大,對分區數據或者表數據更加細粒度的管理。 分桶關鍵字: clustered by(uid) into n buckets 、bucket 、 分桶使用表內字段 怎么分桶?? 對分桶字段進行hash值,然后將hash值模于總的桶數,然后得到桶數

2.分桶的意義:

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'
;

3.分桶的操作:

為分桶表加載數據: 分桶不能使用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分區和分桶的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涿州市| 库尔勒市| 舒兰市| 罗山县| 达孜县| 汉阴县| 河间市| 宕昌县| 额敏县| 沙坪坝区| 布拖县| 惠安县| 四子王旗| 砚山县| 德格县| 尉犁县| 林州市| 兴业县| 环江| 星座| 大冶市| 大埔县| 宾川县| 秦皇岛市| 枣庄市| 新蔡县| 靖远县| 沧州市| 慈溪市| 宁国市| 吕梁市| 买车| 揭阳市| 瑞安市| 斗六市| 株洲县| 桐乡市| 东乡| 东明县| 林甸县| 泸水县|