今天講講分割槽表和分桶表,前面的文章還沒看的可以點選連結:
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 的分割槽,包括如何建立分割槽表、新建分割槽和刪除分割槽,還有二級分割槽和動態分割槽;以及分桶表,包括分桶表的概念和抽樣函式。
持續關注不迷路,轉載請註明出處! —— 大資料的奇妙冒險