您好,登錄后才能下訂單哦!
這篇文章主要介紹hive如何實現(xiàn)分區(qū)和分桶,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
1、Hive分區(qū)表
在Hive Select查詢中一般會掃描整個表內(nèi)容,會消耗很多時間做沒必要的工作。有時候只需要掃描表中關(guān)心的一部分數(shù)據(jù),因此建表時引入了partition概念。分區(qū)表指的是在創(chuàng)建表時指定的partition的分區(qū)空間。 Hive可以對數(shù)據(jù)按照某列或者某些列進行分區(qū)管理,所謂分區(qū)我們可以拿下面的例子進行解釋。
當前互聯(lián)網(wǎng)應(yīng)用每天都要存儲大量的日志文件,幾G、幾十G甚至更大都是有可能。存儲日志,其中必然有個屬性是日志產(chǎn)生的日期。在產(chǎn)生分區(qū)時,就可以按照日志產(chǎn)生的日期列進行劃分。把每一天的日志當作一個分區(qū)。
將數(shù)據(jù)組織成分區(qū),主要可以提高數(shù)據(jù)的查詢速度。至于用戶存儲的每一條記錄到底放到哪個分區(qū),由用戶決定。即用戶在加載數(shù)據(jù)的時候必須顯示的指定該部分數(shù)據(jù)放到哪個分區(qū)。
1.1實現(xiàn)細節(jié)
1、一個表可以擁有一個或者多個分區(qū),每個分區(qū)以文件夾的形式單獨存在表文件夾的目錄下。
2、表和列名不區(qū)分大小寫。
3、分區(qū)是以字段的形式在表結(jié)構(gòu)中存在,通過describetable命令可以查看到字段存在, 但是該字段不存放實際的數(shù)據(jù)內(nèi)容,僅僅是分區(qū)的表示(偽列) 。
1.2語法
1.創(chuàng)建一個分區(qū)表,以 ds 為分區(qū)列:
create table invites(id int, name string) partitioned by (ds string) row format delimited fieldsterminated by ' ' stored as textfile;
2. 將數(shù)據(jù)添加到時間為 2013-08-16這個分區(qū)中:
load data local inpath'/home/hadoop/Desktop/data.txt' overwrite into table invites partition(ds='2013-08-16');
3. 將數(shù)據(jù)添加到時間為 2013-08-20這個分區(qū)中:
load data local inpath'/home/hadoop/Desktop/data.txt' overwrite into table invites partition(ds='2013-08-20');
4. 從一個分區(qū)中查詢數(shù)據(jù):
select * from inviteswhere ds ='2013-08-12';
5. 往一個分區(qū)表的某一個分區(qū)中添加數(shù)據(jù):
insert overwrite tableinvites partition (ds='2013-08-12') select id,max(name) from test group by id;
可以查看分區(qū)的具體情況,使用命令:
hadoop fs -ls /home/hadoop.hive/warehouse/invites
或者:
show partitionstablename;
2、Hive桶
對于每一個表(table)或者分區(qū), Hive可以進一步組織成桶,也就是說桶是更為細粒度的數(shù)據(jù)范圍劃分。Hive也是 針對某一列進行桶的組織。Hive采用對列值哈希,然后除以桶的個數(shù)求余的方式?jīng)Q定該條記錄存放在哪個桶當中。
把表(或者分區(qū))組織成桶(Bucket)有兩個理由:
(1)獲得更高的查詢處理效率。桶為表加上了額外的結(jié)構(gòu),Hive 在處理有些查詢時能利用這個結(jié)構(gòu)。具體而言,連接兩個在(包含連接列的)相同列上劃分了桶的表,可以使用 Map 端連接 (Map-side join)高效的實現(xiàn)。比如JOIN操作。對于JOIN操作兩個表有一個相同的列,如果對這兩個表都進行了桶操作。那么將保存相同列值的桶進行JOIN操作就可以,可以大大較少JOIN的數(shù)據(jù)量。
(2)使取樣(sampling)更高效。在處理大規(guī)模數(shù)據(jù)集時,在開發(fā)和修改查詢的階段,如果能在數(shù)據(jù)集的一小部分數(shù)據(jù)上試運行查詢,會帶來很多方便。
1.創(chuàng)建帶桶的 table :
create tablebucketed_user(id int,name string)clustered by (id) sorted by(name) into 4buckets row format delimited fields terminated by ' ' stored as textfile;
首先,我們來看如何告訴Hive
—個表應(yīng)該被劃分成桶。我們使用CLUSTERED BY 子句來指定劃分桶所用的列和要劃分的桶的個數(shù):
CREATE TABLE bucketed_user(id INT) name STRING)
CLUSTERED BY (id) INTO 4BUCKETS; 在這里,我們使用用戶ID
來確定如何劃分桶(Hive使用對值進行哈希并將結(jié)果除 以桶的個數(shù)取余數(shù)。這樣,任何一桶里都會有一個隨機的用戶集合(PS:其實也能說是隨機,不是嗎?)。
對于map
端連接的情況,兩個表以相同方式劃分桶。處理左邊表內(nèi)某個桶的 mapper知道右邊表內(nèi)相匹配的行在對應(yīng)的桶內(nèi)。因此,mapper只需要獲取那個桶 (這只是右邊表內(nèi)存儲數(shù)據(jù)的一小部分)即可進行連接。這一優(yōu)化方法并不一定要求兩個表必須桶的個數(shù)相同,兩個表的桶個數(shù)是倍數(shù)關(guān)系也可以。
用HiveQL
對兩個劃分了桶的表進行連接,可參見“map連接”部分(P400)。
桶中的數(shù)據(jù)可以根據(jù)一個或多個列另外進行排序。由于這樣對每個桶的連接變成了高效的歸并排序(merge-sort),因此可以進一步提升map
端連接的效率。以下語法聲明一個表使其使用排序桶:
CREATE TABLE bucketed_users(id INT, name STRING)
CLUSTERED BY (id) SORTED BY(id ASC) INTO 4 BUCKETS; 我們?nèi)绾伪WC表中的數(shù)據(jù)都劃分成桶了呢?把在Hive
外生成的數(shù)據(jù)加載到劃分成 桶的表中,當然是可以的。其實讓Hive來劃分桶更容易。這一操作通常針對已有的表。
Hive并不檢查數(shù)據(jù)文件中的桶是否和表定義中的桶一致(
無論是對于桶的數(shù)量或用于劃分桶的列)。如果兩者不匹配,在査詢時可能會碰到錯 誤或未定義的結(jié)果。因此,建議讓Hive來進行劃分桶的操作。
2. 往表中插入數(shù)據(jù):
INSERT OVERWRITE TABLEbucketed_users SELECT * FROM users; 物理上,每個桶就是表(
或分區(qū))目錄里的一個文件。它的文件名并不重要,但是桶 n 是按照字典序排列的第 n 個文件。
事實上,桶對應(yīng)于 MapReduce
的輸出文件分區(qū):一個作業(yè)產(chǎn)生的桶(輸出文件)和reduce任務(wù)個數(shù)相同.
3. 對桶中的數(shù)據(jù)進行采樣:
hive> SELECT * FROMbucketed_users
> TABLESAMPLE(BUCKET 1 OUT OF 4 ON id);
0 Nat
4 Ann 桶的個數(shù)從1
開始計數(shù)。因此,前面的查詢從4個桶的第一個中獲取所有的用戶。 對于一個大規(guī)模的、均勻分布的數(shù)據(jù)集,這會返回表中約四分之一的數(shù)據(jù)行。我們 也可以用其他比例對若干個桶進行取樣(因為取樣并不是一個精確的操作,因此這個 比例不一定要是桶數(shù)的整數(shù)倍)。
注:tablesample是抽樣語句,語法:TABLESAMPLE(BUCKET x OUTOF y)
y必須是table總bucket數(shù)的倍數(shù)或者因子。hive根據(jù)y的大小,決定抽樣的比例。例如,table總共分了64份,當y=32時,抽取(64/32=)2個bucket的數(shù)據(jù),當y=128時,抽取(64/128=)1/2個bucket的數(shù)據(jù)。x表示從哪個bucket開始抽取。例如,table總bucket數(shù)為32,tablesample(bucket 3 out of 16),表示總共抽取(32/16=)2個bucket的數(shù)據(jù),分別為第3個bucket和第(3+16=)19個bucket的數(shù)據(jù)。
以上是“hive如何實現(xiàn)分區(qū)和分桶”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。