分割槽是hive在處理大型表時常用的方法。分割槽(partition)在hive的物理儲存中,體現為表名下的某個目錄,這個目錄下儲存著這個分割槽下對應的資料。分割槽的好處在於縮小查詢掃瞄範圍,從而提高速度。分割槽分為兩種:靜態分割槽static partition和動態分割槽dynamic partition。靜態分割槽和動態分割槽的區別在於匯入資料時,是手動輸入分割槽名稱,還是通過資料來判斷資料分割槽。對於大資料批量匯入來說,顯然採用動態分割槽更為簡單方便。
先看乙個沒有分割槽的表:
create table dyn_part_src_spark
(name_src string,
score_src string,
grade_src string,
class_src string)
row format delimited fields terminated by ',';
我們可以把相應的資料裝在到dyn_part_src_spark這個表中
load data local inpath '/testpartition_2.txt'
testpartition_2.txt的內容可以是這樣的:
name1,11,grade1,class1
name2,22,grade1,class1
name3,33,grade1,class2
name4,44,grade1,class2
name5,55,grade2,class1
name6,66,grade2,class1
name7,77,grade2,class2
name8,88,grade2,class2
裝載資料完畢之後
可以去hdfs上檢視目錄/user/hive/warehouse/dyn_part_src_spark ,可以看到剛才匯入的資料都在這個目錄下,因為這是個沒有分割槽的表
分割槽表的是這樣被建立的:
create table dyn_part_test_spark
(name string,
score string
)partitioned by (
grade string,
class string)
row format delimited fields terminated by ',';
在裝載資料後,分割槽的列grade和class以及它們對應的值會被拼接成為/user/hive/warehouse/dyn_part_test_spark 目錄下的若干個子目錄
先來看乙個靜態態分割槽的例子,執行下面的語句,注意partition關鍵字後面,grade和class的值都是指定的。
insert overwrite table dyn_part_test_spark partition(grade='grade1',class='class1')
select name_src,score_src,class_src
from dyn_part_src_spark
where grade_src='grade2'and class_src='class2';
執行語句成功後,開啟/user/hive/warehouse/dyn_part_test_spark 目錄,會發現乙個grade=grade1目錄,裡面還有乙個目錄class=class1,對應的資料就存放在這個目錄下面。
分割槽的作用很明顯,當以指定的分割槽列作為查詢條件的時候,hive會通過分割槽列和指定的值快速的確定要掃瞄的目錄,大大加快了查詢的資料。
但是靜態分割槽有乙個很大的問題,要求在partition關鍵字後面,對應分割槽列的值要被指定的。當分割槽列的值有很多個的時候,就需要重複執行很多次類似的insert語句。例如,在testpartition_2.txt 中,grade和class的值得組合就有四種(grade=grade1/class=class1;grade=grade1/class=class2;grade=grade2/class=class1;grade=grade2/class=class2)。為了解決這個問題,hive提出了動態分割槽的技術。
執行如下語句:
1)set hive.exec.dynamic.partition.mode=nonstrict;
注意自行下面語句的時候,partition關鍵字後面的grade和class都沒有指定具體的值
2) insert overwrite table dyn_part_test_spark partition(grade,class)
select name_src,score_src,grade_src,class_src
from dyn_part_src_spark;
執行成功後,開啟/user/hive/warehouse/dyn_part_test_spark 目錄,發現裡面的子目錄是這樣組織的
兩個一級子目錄grade=grade1和grade=grade2,在這兩個子目錄下面,分別存在兩個二級子目錄class=class1和class=class2,對應的資料分別存在對應的子目錄下。
可見,通過動態分割槽技術,不但可以一次匯入資料,而且同時能夠根據源資料中不同的分割槽列的值,動態的生成對應的目錄,並把對應的資料寫入對應的目錄中
Hive靜態分割槽和動態分割槽
需求 需要建立乙個備份帶分割槽的資料表,拷貝時若採用靜態分割槽方式需要寫n行語句,建議使用動態分割槽,節省大量時間。hive的分割槽方式 由於hive實際是儲存在hdfs上的抽象,hive的乙個分割槽名對應乙個目錄名,子分割槽名就是子目錄名,並不是乙個實際字段。hive中支援兩種型別的分割槽 靜態分...
HIVE分割槽,靜態分割槽,動態分割槽
分割槽可以大大提公升hive的效能,這裡就要提到數倉的分層 原始資料層,儲存原始收集的資料 數倉明細層,裡面做的是轉換和分析,裡面包含部分的資料清洗的過程 數倉服務層,對外業務的處理,如維度轉 鍵 身份證清洗 會員註冊 清晰 字段合併 空值處理 髒資料處理 ip清晰轉換等 最終業務層 適合做增量表,...
Hive 動態分割槽 靜態分割槽
本文 參考 hive預設是靜態分割槽。但是有時候可能需要動態建立不同的分割槽來區分不同的分類。hive中建立分割槽表沒有什麼複雜的分割槽型別 範圍分割槽 列表分割槽 hash分割槽 混合分割槽等 分割槽列也不是表中的乙個實際的字段,而是乙個或者多個偽列。意思是說在表的資料檔案中實際上並不儲存分割槽列...