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清晰轉換等 最終業務層 適合做增量表,...