Hive(二) 分區分桶,內部表外部表

2021-09-02 02:34:14 字數 3610 閱讀 3806

hive是hadoop生態圈中實現資料倉儲的一項技術。雖然hadoop和hdfs的設計侷限了hive所能勝任的工作,但是hive仍然是目前網際網路中最適合資料蒼鷺的應用技術。不論從「品相還是舉止」,hive都像乙個關係型資料庫。使用者對資料庫、表和列這類術語比較熟悉的話,那麼掌握hive的查詢語言hql也輕而易舉。不過,hive的實現和使用方式與傳統的關聯式資料庫相比,有很多不同的地方。

hive將資料表分為內部表和外部表。

內部表在hive中穿點的普通的表都可以稱為「內部表」。因為hive可以(或多或少)控制其資料的生命週期,內部表對資料擁有所有權。比如我們常見的,通常hive會將內部表資料儲存在有hive.metastore.warehouse.dir所定義的目錄下。

所以,當刪除乙個內部表時,相應的資料也會被刪除。

外部表

內部表不方便共享資料來源。例如,當採用如pig或mapreduce等李樹工具資料處理時,我們將無法讀取內部表的資料,也不能將外部資料直接作為內部表資料來源分享給hive。這樣的需求就誕生了外部表。不同於內部表,hive對外部表的資料僅僅擁有使用權,而資料位置可有表管理者任意配置。

如圖所示:外部表不需要將資料複製到hive中,一旦關聯資料格式和資料位置,hive就能直接訪問外部資料,非常靈活方便,即插即用。

而載入內部表資料時,hive會自動將資料來源拷貝到內部。內部表其實訪問的是資料副本。

注意:hive架子啊內部表資料後會把源資料刪除,很像「剪下/移動」,所以,忘內部表上傳資料時,千萬記得備份資料!

對於大型資料處理系統而言,資料分割槽的功能非常重要的。因為hive通常要對資料進行全盤掃瞄,才能滿足查詢條件。

以hive管理大型**的瀏覽日誌為例。如果日誌資料不採用分割槽實際,那麼就單日**流量分析這樣的需求而言,hive就必然要通過遍歷全量日誌來完成查詢。以一年日誌為全量,單日查詢的資料利用率將不到1%,這樣的設計基本上將查詢的時間浪費在了資料載入上。分割槽的優勢在於利用唯獨分割資料。在使用分割槽維度查詢時,hive只需要載入資料,極大縮短資料載入時間。

由於hdfs被設計用於儲存大型資料檔案而非海量碎片檔案,理想的分割槽方案不應該導致過多的分割槽檔案,並且每個目錄下的檔案盡量超過hdfs塊大小的若干倍。按天級時間粒度進行分割槽就是乙個號的分割槽策略,隨時間的推移,分割槽數量增長均可控。此外常有的分割槽策略還有地域,語言種類等等。設計分割槽的時候,還有乙個誤區要避免。關於分割槽維度的選擇,我們應該盡量選擇那些有限且少量的資料集作為分割槽,例如國家、省份就是乙個良好的分割槽,而城市就可能不適合進行分割槽。

注意:分割槽是資料表的乙個列名,但是這個列名並不占有表的實際儲存空間。他作為乙個虛擬列為存在。

分割槽提供了一種整理資料和優化查詢的遍歷方式。不過,並非所有資料集都可形成合力的分割槽,特別是在需要合力劃分資料、防止傾斜時。分桶是將資料分解管理的另一種技術。

分桶解決的是資料傾斜的問題。因為痛的資料固定,所以沒有資料波動。桶對於資料抽樣在適合不過,同時也有利於高效的map-side join。

分桶與分割槽的關係:

分割槽和分桶都可以單獨於表

分割槽可以是多級

分割槽和分桶可以巢狀使用,但是分割槽必須在分桶前面

分割槽表:

乙個表可以擁有乙個或多個分割槽,每個分割槽以資料夾的形式單獨存在於表資料夾的目錄下

表和列名不區分大小寫

分割槽是以字段的形式在表結構中存在,通過desc table tablename命令可以檢視到字段的存在,但是該字段不存放實際的資料內容,僅僅是分割槽的標識(偽列)

語法:1.建立乙個分割槽表

create table t_hive_partition(id int,name string) partitioned by (ds string) row format delimited fields terminated by '\t' stored as textfile

2.將資料新增到時間為***x這個分割槽中

load data local inpath '/root/hive_partition.data' overwrite into table t_hive_partition pasrtition(ds = '2018-11-28');

3.從乙個分割槽表中查詢資料:

select * from t_hive_partition where ds = '2018-11-28';

4.檢視具體的分割槽情況

show partitions tablename;

分桶分割槽:

對於每乙個表或者分割槽,hive可以進一步組織成桶,也就是說是更為細粒度的資料範圍劃分。hive也是針對某一行進行桶的組織。hive採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在呢個桶裡面。

比如現在有這樣的資料:我們分四個桶

1  張三

2  李四

3  王五

4  魯班

5  黃忠

桶1裡面有(實際檔名為00000):4魯班

桶2裡面有(實際檔名為00001):1 張三  5黃忠

桶3裡面有(實際檔名為00002):2 李四

桶4裡面有(實際檔名為00003):3 王五

(1)獲得更高的查詢處理效率。桶為表加上了額外的結構,hive在處理有些查詢時能利用這個結構。

(2)使取樣(sampling)更高效。在處理大規模資料集是,在開發和修改查詢的階段,如果能在資料集的一小部分資料上試執行查詢,會帶來很多的方便。

建立帶桶的表:

create table t_bucket(id int,name string) clustered by (id) sorted by (name) into 4 buckets row format delimited fields terminated by '\t' stored as textfile;

強制多個reduce進行輸出

​​​​​​要向分桶表中填充成員,需要將hive.enforce.bucketing屬性設定為true。這樣。hive就知道用表定義中宣告的數量來建立桶。然後使用insert命令即可。需要注意的是:clustered by和sorted by 不會影響資料匯入,這意味著,使用者必須自己負責資料如何匯入,包釦資料的分桶和排序

往表中插入資料

一般對於分桶表,新增資料採用將另乙個表中查詢的結果insert到這個分桶表中

對桶中資料進行取樣:

select * from t_bucket tablesample(bucket 1 out of 4 on id);

桶的個數從1開始計數,因此,前面的查詢從4個桶的第乙個中獲取所有的使用者。對於乙個大規模的、均勻分布的資料集,這回返回表中四分之一的資料行。我們也可以用其他比例對若干桶進行取樣。

注:tablesample是抽樣語句,語法:tablesample(bucket x out of y)

y必須是table總bucket數的倍數或者因子。hive根據y的大小,決定抽樣的比例。例如,table總共分了64份,當y=32時,抽取(64/32=)2個bucket的資料,當y=128時,抽取(64/128=)1/2個bucket的資料。x表示從哪個bucket開始抽取。例如,table總bucket數為32,tablesample(bucket 3 out of 16),表示總共抽取(32/16=)2個bucket的資料,分別為第3個bucket和第(3+16=)19個bucket的資料。

Hive 中內部表 外部表,分割槽表,分桶表

1.內部表 外部表 管理表 內錶,也叫託管表 外部表 外表 建表時,有external關鍵字的就是外部表。在drop table時,外表的資料是不會被刪除的,內錶的資料會被刪除,但兩者對應的元資料 metadata 是都會被刪除的 如果資料只是給hive用,那麼建議建立內錶 如果資料還可能會給hiv...

hive中外部表 內部表 分割槽表 分桶表

建立資料庫 create database myhive 選擇資料庫 use myhive 建立外部表 external createexternaltable techer t id string,t name string row format delimited fields terminat...

Hive 內部外部分區分桶 表詳解 區別

hive 內部表與外部表的區別 按照管理許可權分為 內部表和外部表 區分原理 真實表資料的管理許可權 是 hive 內部所有 還是 hdfs 所有 external table hive 預設建立內部表,若建表指定 external 則建立外部表 兩者之間的區別 刪除內部表,刪除表元資料和資料 刪除...