分割槽主要用於提高效能
分割槽列的值將表劃分為乙個個的資料夾
查詢時語法使用"分割槽"列和常規列類似
查詢時hive會只從指定分割槽查詢資料,提高查詢效率
注:由於hive實際是儲存在hdfs上的抽象,hive的乙個分割槽名對應乙個目錄名,子分割槽名就是子目錄名,並不是乙個實際字段。
所以可以這樣理解,當我們在插入資料的時候指定分割槽,其實就是新建乙個目錄或者子目錄,或者在原有的目錄上新增資料檔案。
分為靜態分割槽和動態分割槽
示例演示
建立資料,準備用性別分割槽
開啟hive建立表
hive> create table userinfo(
> userid string,
> username string,
> brithday string
>
)> partitioned by (*** string)
> row format delimited fields terminated by ','
> stored as textfile;
oktime taken: 0.247 seconds
hive> desc userinfo; //檢視表結構
okuserid string
username string
brithday string
*** string
# partition information //分割槽資訊
# col_name data_type comment
*** string
用load直接傳輸資料並用靜態分割槽(錯誤)
注意這裡會存在問題,這裡並不是真正的分割槽,而是強行把所有資料傳入分割槽,並把對應的屬性在展示時全改為分割槽的屬性,而實際屬性未發生改變。在hdfs上查詢檔案,其真實內容如下圖
先在hdfs上建立資料夾,存放資料檔案
hive>
!hdfs dfs -mkdir -p /wh;
hive>
!hdfs dfs -put /opt/software/info.csv /wh;
建立原始表存放資料,路徑為剛剛上傳位址
hive> create table ods_user (
> userid string,
> username string,
> brithday string,
> *** string
>
)> row format delimited fields terminated by ','
> location '/wh'
>
;
通過這張表向分割槽表中插入資料在插入資料時注意 ,後面select中不要將分割槽的屬性也查詢插入。按照分割槽的屬性分別插入
hive> insert into userinfo partition(***=
'male'
)select userid,username,brithday from ods_user where ***=
'male'
;
hive> insert into userinfo partition(***=
'female'
)select userid,username,brithday from ods_user where ***=
'female'
;
插入結束後可以檢視網頁192.168.73.39:50070頁面
如果用上述的靜態分割槽,插入的時候必須首先要知道有什麼分割槽型別,而且每個分割槽都要寫乙個insert語句,在某些場景下還是比較麻煩。使用動態分割槽可解決以上問題,其可以根據查詢得到的資料動態分配到分割槽裡。其實動態分割槽與靜態分割槽區別就是不指定分割槽目錄,由系統自己選擇。
建立表
hive> create table myusers(
> userid string,
> username string,
> brithday string
>
)> partitioned by (*** string)
> row format delimited fields terminated by ','
> stored as textfile;
使用動態分割槽需設定屬性
hive>
set hive.exec.dynamic.partition=true; //開啟
hive>
set hive.exec.dynamic.partition.mode=nonstrict; //設定分割槽模式為非嚴格模式
從原始表中直接插入資料
hive> insert into myusers partition(***)
select * from ods_user;
成功顯示,可以看出它直接根據***的兩個屬性自動分割槽
網頁顯示
Hive靜態分割槽和動態分割槽
需求 需要建立乙個備份帶分割槽的資料表,拷貝時若採用靜態分割槽方式需要寫n行語句,建議使用動態分割槽,節省大量時間。hive的分割槽方式 由於hive實際是儲存在hdfs上的抽象,hive的乙個分割槽名對應乙個目錄名,子分割槽名就是子目錄名,並不是乙個實際字段。hive中支援兩種型別的分割槽 靜態分...
高效辨別Hive的靜態和動態分割槽
1 hive中有分割槽表的概念,我們可以看到分割槽具有重要效能優勢,分割槽表可以將資料以一種符合邏輯的方式進行組織,比如分層儲存。2 查詢分割槽表中的資料時,除非where語句中包含分割槽字段過濾條件來顯示資料範圍,否則不允許執行。3 換句話說,就是使用者不允許掃瞄所有的分割槽。4 進行這個顯示的原...
hive中的動態分割槽和靜態分割槽
對於向一張hive分割槽表寫入資料,一般可以這樣 insert into tb partition par col par value select id,name from tb1 這樣,資料都會被插入到tb表的par value分割槽下。有時候我們會遇到這樣的場景 tb1表下有個字段,比如mon...