Hive 分割槽 和 分桶 的區別

2021-10-03 11:57:50 字數 2019 閱讀 7083

背景

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 表指...