hive 動態分割槽和靜態分割槽

2021-07-24 16:45:53 字數 1111 閱讀 8204

hive分割槽,實際上是通過乙個路徑來標識的,而不是在物理資料中。比如每天的資料,可能分割槽是pt=20121023這樣,那麼路徑中它就會變成:/hdfs/path/pt=20121023/data_files。通過路徑來標識的好處是,如果我們需要取特定分割槽的資料,只需要把這個路徑下的資料取出來就可以了,不用掃瞄全部的資料。

set hive.exec.dynamic.partition=true;  

set hive.exec.dynamic.partition.mode=nonstrict;  

然後**裡就可以這麼寫:

insert overwrite table tbl_name partition(pt, if_online)

select field1, field2, ..., pt, if_online

from tbl

where ***;

注意輸入欄位的最後面必須是動態分割槽字段。

看一下與靜態分割槽寫法的區別:

insert overwrite table tbl_name partition(pt=20121023, if_online=1)  

select field1, field2, ..., fieldn  

from tbl  

where ***;  

動態分割槽與靜態分割槽還有乙個細微的差別是,靜態分割槽一 定會建立分割槽,不管select語句的結果有沒有資料。而動態分割槽,只有在select結果的記錄數》0的時候,才會建立分割槽。因此在不同的業務場景下,可能會選擇不同的方案。

另外使用動態分割槽時需要注意的比較重要的一點是,動態分割槽會為每乙個分割槽分配reduce數。比如說你在指令碼上面寫了:set mapred.reduce.tasks=100;

並且有兩個分割槽:pt, if_online。如果結果集中pt=20121023,if_online=0/1,那麼它就會為pt=20121023/if_online=0,pt=20121023/if_online=1各分配100個reduce。也就是說,namenode會同時處理200個檔案的寫操作。這在分割槽值很多的情況下,會成為乙個災難,容易直接把namenode給搞掛掉,是非常危險的。因此使用動態分割槽時,一定要清楚地知道產生的動態分割槽值,並且合理地設定reduce數量。

hive中的動態分割槽和靜態分割槽

對於向一張hive分割槽表寫入資料,一般可以這樣 insert into tb partition par col par value select id,name from tb1 這樣,資料都會被插入到tb表的par value分割槽下。有時候我們會遇到這樣的場景 tb1表下有個字段,比如mon...

原創 hive中的分割槽,動態分割槽和靜態分割槽

分割槽是hive在處理大型表時常用的方法。分割槽 partition 在hive的物理儲存中,體現為表名下的某個目錄,這個目錄下儲存著這個分割槽下對應的資料。分割槽的好處在於縮小查詢掃瞄範圍,從而提高速度。分割槽分為兩種 靜態分割槽static partition和動態分割槽dynamic part...

HIVE分割槽,靜態分割槽,動態分割槽

分割槽可以大大提公升hive的效能,這裡就要提到數倉的分層 原始資料層,儲存原始收集的資料 數倉明細層,裡面做的是轉換和分析,裡面包含部分的資料清洗的過程 數倉服務層,對外業務的處理,如維度轉 鍵 身份證清洗 會員註冊 清晰 字段合併 空值處理 髒資料處理 ip清晰轉換等 最終業務層 適合做增量表,...