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

2021-06-26 04:11:45 字數 2527 閱讀 1695

分割槽是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分割槽 混合分割槽等 分割槽列也不是表中的乙個實際的字段,而是乙個或者多個偽列。意思是說在表的資料檔案中實際上並不儲存分割槽列...