hive從入門到放棄(四)——分割槽與分桶

大資料的奇妙冒險發表於2022-04-02

今天講講分割槽表和分桶表,前面的文章還沒看的可以點選連結:
hive從入門到放棄(一)——初識hive
hive從入門到放棄(二)——DDL資料定義
hive從入門到放棄(三)——DML資料操作

分割槽

分割槽可以提高查詢效率,實際上 hive 的一個分割槽就是 HDFS 上的一個目錄,目錄裡放著屬於該分割槽的資料檔案。

分割槽的基本操作

建立分割槽表

create table partition_table(
	col1 int, 
	col2 string
)
partitioned by (part_col string)
row format delimited fields terminated by '\t';

*分割槽欄位不能是表中欄位

建立完分割槽表如果需要將資料匯入表中,需要用 load 命令匯入;

 load data local inpath 
'/data_dir/data_file' into table partition_table 
partition(part_col='20220331');

如果是在 HDFS 中建立目錄並將資料檔案傳到目錄中,是沒辦法查到的,因為查詢分割槽表是需要查詢後設資料的;

如果非要用這種方法或者已經做了,可以執行修復命令: msck repair table table_name;

檢視分割槽

show partitions partition_table;

查詢

select * from partition_table where part_col='20220331';

新增分割槽

alter table partition_table add partition(part_col='20220331');

刪除分割槽

alter table partition_table drop partition(part_col='20220331');

二級分割槽

二級分割槽相當於在一級分割槽對應的目錄上新增一個目錄,一般用於單個分割槽資料量很大,需要做拆解的情況。

建立二級分割槽表

create table partition_table(
	col1 int, 
	col2 string
)
partitioned by (part_col1 string, part_col2 string)
row format delimited fields terminated by '\t';

二級分割槽表的其它操作與一級的區別不大,因此不做過多的描寫。

動態分割槽

關係型資料庫中,對分割槽表 Insert 資料時候,資料庫自動會根據分割槽欄位的值,將資料插入到相應的分割槽中

Hive 中也提供了類似的機制,即動態分割槽(Dynamic Partition),不過使用 Hive 的動態分割槽需要進行相應的配置。

開啟動態分割槽功能(預設 true,開啟)

hive.exec.dynamic.partition=true

設定為非嚴格模式

hive.exec.dynamic.partition.mode=nonstrict

預設 strict,表示至少指定一個分割槽為靜態分割槽,nonstrict 表示允許所有的分割槽欄位都能使用動態分割槽。

所有執行 MR 的節點上,最大一共可以建立多少個動態分割槽。預設 1000

hive.exec.max.dynamic.partitions=1000

每個執行 MR 的節點上,最大可以建立多少個動態分割槽。比如源資料中包含了一年的資料,即 day 欄位有 365 個值,那麼該引數就
需要設定成大於 365,如果使用預設值 100,則會報錯。

hive.exec.max.dynamic.partitions.pernode=100

動態插入資料到分割槽

insert into partition_table partition(part_col) select * from table_name;

分桶

分割槽提高了資料的查詢效率,同時還能將資料隔離開,但是並非所有資料能形成合理的分割槽。

hive可以將資料進行分桶,不同於分割槽是針對儲存路徑進行分類,分桶是在資料檔案中對資料進行劃分的一種技術。

分桶是指定某一列,讓該列資料按照雜湊取模的方式隨機、均勻的分發到各個桶檔案中。

建立分桶表

-- 分 6 個桶的分桶表
create table bucket_table(col1 int, col2 string)
clustered by(col1) 
into 6 buckets
row format delimited fields terminated by '\t';

載入資料

載入資料到分桶表中可以使用 load 或者 insert 的方式。

需要注意的是,reduce 的個數設定應該為-1,讓 Job 自行決定需要用多少個 reduce 或者將 reduce 的個
數設定為大於等於分桶表的桶數。

抽樣

對於非常大的資料集,有時使用者需要使用的是一個具有代表性的查詢結果而不是全部結
果。Hive 可以通過對錶進行抽樣來滿足這個需求。

語法:tablesample(bucket x out of y)

select * from bucket_table tablesample(bucket 1 out of 3 on col1);

y必須是table總共bucket數的倍數或者因子。

上面的語句表示:對於分桶數為 6 的表,總共抽取 6/y = 6/3 = 2 個bucket的資料,

分別為第 x=1 個 bucket 和第 x+3=4 個 bucket 的資料。

小結

本文簡單介紹了 hive 的分割槽,包括如何建立分割槽表、新建分割槽和刪除分割槽,還有二級分割槽和動態分割槽;以及分桶表,包括分桶表的概念和抽樣函式。

持續關注不迷路,轉載請註明出處! —— 大資料的奇妙冒險

相關文章