一、分割槽
mr的分割槽:是將資料按照一定的邏輯進行查分,劃分為不同的區域,這個區域的資料將會給指定的reduce。
hive的分割槽:對錶劃分成幾個區域,通過分類把不同型別的資料放到不同的目錄下。
分割槽表與普通表相比它的優勢和劣勢
優勢:和普通表相比,當按照分割槽條件進行過濾的時候分割槽表會比普通表查詢的效率高很多,因為和普通表相比它會減少笛卡爾積,不用進行全表掃瞄。
劣勢:理論上來講分割槽的數量越多查詢時的效率就會越高,但是分割槽量的增加會引起元資料的增加導致namenode壓力越大,因此一定不能無限制的產生分割槽。
1.靜態分割槽 :機械的指定分割槽的條件
eg: create
table tablename(col coltype.
.) partitioned by
(col type
)row format delimited fields termined by
" ";
2.多個分割槽:乙個表中存在多個字段分割槽(注意:分割槽的父子關係不能寫錯)
eg: create
table t_p1(id int
,day
int,
temp
double
) partitioned by
(year
int,
month
int)
row format delimited fields
terminated
by" "
;
3.動態分割槽:當指定乙個或者多個分割槽字段,那麼再插入資料的時候就可以按照欄位的值進行自動分割槽,實現動態識別。(注意:往動態分割槽表中新增資料不能用load,因為沒法區分欄位的型別,需要用insert但是對於大量的資料來講insert是不合適的所以推薦建立乙個臨時表,通過load將資料方法到臨時表中,再從臨時表中查詢資料,得出結果再放到分割槽表中)
4.混合分割槽 :為了應對當資料量特別大的時候,如果使用動態分割槽會產生大量的元資料,導致namenode 的壓力變大,進行混合分割槽,但必須保證多個分割槽欄位的首個字段一定是靜態字段。
二、分桶
分桶就是在分割槽的基礎上進行二次劃分,又將資料切分成桶即將在這個分割槽中的資料按照某一列的hashcode與桶的數量進行取餘,得出的就是桶的編號。
eg:create
table t_cluster(id int
,day
int,tmp double
) partitioned by
(month
int)
clustered
by(id)
into
3 buckets;
優勢:就是將兩個標的資料都按照關聯的那個列進行分桶,以後兩個表的資料進行關聯的時候,就直接在對應的通上進行關聯,增加查詢效率並大量的減少笛卡爾積。
劣勢:和分割槽一樣,都會增加namenode 的壓力。
三、索引
以上談論的分割槽和分桶都是只能優化查詢到某個群體,不能具體到的那個資料,為了實現查詢到的那個資料的優化,就產生了索引,對hive中的資料,會產生乙個新檔案,這個檔案會記錄每個資料的位置。
eg:create
index index_name on
table tablename(col)
as'org.apache.hadoop.hive.ql.index.compact.compactindexhandler'
with deferred rebuild;
Hive分割槽 分桶
create table t user partition id int name string partitioned by country string row format delimited fields terminated by load data local inpath root h...
Hive分割槽 分桶
2 靜態分割槽 二 hive分桶 1.分割槽列的值將表劃分為乙個個的資料夾 2.查詢時語法使用 分割槽 列和常規列類似 3.查詢時hive會只從指定分割槽查詢資料,提高查詢效率 建立單級分割槽表 create table ifnot exists employee partition name st...
hive學習 分割槽 分桶和索引
分割槽是以字段的形式在表結構中存在,通過describe table命令可以檢視到字段存在,但是該字段不存放實際的資料內容,僅僅是分割槽的表示 偽列 1 靜態分割槽 create table if not exists sopdm.wyp2 id int,name string,tel string...