背景
hive使用select語句進行查詢的時候一般會掃瞄整個表內容,會消耗很多時間做沒必要的工作。hive可以在建立表的時候指定分割槽空間,這樣在做查詢的時候就可以很好的提高查詢的效率。分割槽:在hdfs上的表現形式是乙個
目錄
,
分桶:在hdfs上的表現形式是乙個單獨的檔案
//建立分割槽表
create
table student(
id int
,name string,
age int
,address string
)partitioned by
(dt string,
type string)
//制定分割槽
row format delimited fields
terminated
by'\t'
//指定字段分隔符為tab
collection items terminated
by','
//指定陣列中欄位分隔符為逗號
map keys
terminated
by':'
//指定字典中kv分隔符為冒號
lines
terminated
by'\n'
//指定行分隔符為回車換行
stored as textfile //指定儲存型別為檔案
;//將資料載入到表中(此時時靜態分割槽)
load
data
local inpath '/root/student.txt'
into test.student partition
(class=
'一班'
);
注意:建立分割槽表時:
//建立分桶表
create
table student(
id int
,name string,
age int
,address string
)clustered
by(id) sorted by
(age)
into
4 buckets
row format delimited fields
terminated
by'\t'
stored as textfile;
//開啟分桶
set hive.enforce.bucketing =
true
;//插入資料
insert overwrite table studentselect id ,name ,age ,address from employees;
//也可以用另一種插入方式
load
data
local inpath '/root/student.txt'
into test.student;
分桶隨機
分割資料庫,分割槽是非隨機分割資料庫。因為分桶是按照列的雜湊函式
進行分割的,相對比較平均;而分割槽是按照列的值來進行分割的,容易造成資料傾斜。
分桶是對應不同的檔案(細粒度)
,分割槽是對應不同的資料夾(粗粒度)
。桶是更為細粒度的資料範圍劃分,分桶的比分區獲得更高的查詢處理效率,使取樣更高效。
注意:普通表(外部表、內部表)、分割槽表這三個都是對應hdfs上的目錄
,桶表對應是目錄裡的檔案
當從桶表中進行查詢時,hive會根據分桶的字段進行計算分析出資料存放的桶中,然後直接到對應的桶中去取資料,這樣做就很好的提高了效率。
參考1參考2
Hive分割槽和分桶區別
一.定義上 分割槽 建立分割槽表 create table student id int,name string,age int,address string partitioned by dt string,type string 制定分割槽 row format delimited fields...
hive面試 Hive分割槽和分桶的區別
分割槽針對的是資料的儲存路徑,分割槽提供乙個隔離資料和優化查詢的便利方式。不過並不是所有的資料集都可形成合理的分割槽。create table student partitioned score int name string name string partitioned by age int r...
HIVE 索引 分割槽和分桶的區別
一 索引 hive支援索引,但是 hive 的索引與關係型資料庫中的索引並不相同,比如,hive 不支援主鍵或者外來鍵。hive索引可以建立在表中的某些列上,以提公升一些操作的效率,例如減少 mapreduce 任務中需要讀取的資料塊的數量。為什麼要建立索引?hive的索引目的是提高 hive 表指...