hive從入門到放棄(四)——分區與分桶
今天講講分區表和分桶表,前面的文章還沒看的可以點擊鏈接:
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 的分區,包括如何創建分區表、新建分區和刪除分區,還有二級分區和動態分區;以及分桶表,包括分桶表的概念和抽樣函數。
持續關注不迷路,轉載請註明出處! —— 大數據的奇妙冒險