hive分割槽表詳細介紹
一,什麼是分割槽表以及作用
資料分割槽的概念以及存在很久了,通常使用分割槽來水平分散壓力,將資料從物理上移到和使用最頻繁的使用者更近的地方,以及實現其目的。 hive中有分割槽表的概念,我們可以看到分割槽具重要效能優勢,而且分割槽表還可以將資料以一種符合邏輯的方式進行組織,比如分層儲存
分割槽表分別有靜態分割槽和動態分割槽
二、 靜態分割槽
1,建立靜態分割槽格式:
create table employees ( name string, salary float, subordinated array<string>, deductions map<string,float>, address struct<street:string,city:string,state:string,zip:int> ) partitioned by (country string,state string) row format delimited fields terminated by "\t" collection items terminated by "," map keys terminated by ":" lines terminated by "\n" stored as textfile;
建立成果後發現他的儲存路徑和普通的內部表的路徑是一樣的而且多了分割槽表的欄位,因為我們建立的分割槽表並沒內容,事實上,除非需要優化查詢效能,否則實現表的使用者不需要關係"欄位是否是分割槽欄位"
2,然後我們新增分割槽表
alter table employees add partition (country="china",state="Asia");
檢視分割槽表資訊: show partitions employees;
hdfs上的路徑:/user/hive/warehouse/zxz.db/employees/country=china/state=Asia 他們都是以目錄及子目錄形式儲存的
3,插入資料:
格式: INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row …]; 格式2:(推薦使用) load data local inpath '/home/had/data1.txt' into table employees partition (country =china,state=Asia)
4,利用分割槽表查詢:(一般分割槽表都是利用where語句查詢的)
5,CTAS語句和like
建立表,攜帶資料 create table employees1 as select * from employees1 建立表,攜帶表結構 create table employees2 like employees
6,外部分割槽表:
外部表同樣可以使用分割槽,事實上,使用者會發現,只是管理大型生產資料集最常見的情況,這種結合給使用者提供一個和其他工具共享資料的方式,同時也可以優化查詢效能
create external table employees_ex ( name string, salary float, subordinated array<string>, deductions map<string,float>, address struct<street:string,city:string,state:string,zip:int> ) partitioned by (country string,state string) row format delimited fields terminated by "\t" collection items terminated by "," map keys terminated by ":" lines terminated by "\n" stored as textfile; location "/user/had/data/" //他其實和普通的靜態分割槽表一樣就是多了一個external關鍵字
這樣我們就可以把資料路徑改變而不影響資料的丟失,這是內部分割槽表遠遠不能做的事情:
1,(因為我們建立的是外部表)所有我們可以把表資料放到hdfs上的隨便一個地方這裡自動資料載入到/user/had/data/下(當然我們之前在外部表上指定了路徑) load data local inpath '/home/had/data.txt' into table employees_ex partition (country="china",state="Asia"); 2,如果我們載入的資料要分離一些舊資料的時候就可以hadoop的distcp命令來copy資料到某個路徑 hadoop distcp /user/had/data/country=china/state=Asia /user/had/data_old/country=china/state=Asia 3,修改表,把移走的資料的路徑在hive裡修改 alter table employees partition(country="china",state="Asia") set location '/user/had/data_old/country=china/state=Asia' 4,使用hdfs的rm命令刪除之前路徑的資料 hdfs dfs -rmr /user/had/data/country=china/state=Asia 這樣我們就完成一次資料遷移 如果覺得突然忘記了資料的位置使用使用下面的方式檢視 describe extend employees_ex partition (country="china",state="Asia");
7,刪除分割槽表
alter table employees drop partition(country="china",state="Asia");
8,眾多的修改語句
1,把一個分割槽打包成一個har包 alter table employees archive partition (country="china",state="Asia") 2, 把一個分割槽har包還原成原來的分割槽 alter table employees unarchive partition (country="china",state="Asia") 3, 保護分割槽防止被刪除 alter table employees partition (country="china",state="Asia") enable no_drop 4,保護分割槽防止被查詢 alter table employees partition (country="china",state="Asia") enable offline 5,允許分割槽刪除和查詢 alter table employees partition (country="china",state="Asia") disable no_drop alter table employees partition (country="china",state="Asia") disable offline
9,通過查詢語句向表中插入資料
insert overwrite/into table copy_employees partition (country="china",state="Asia") select * from employees es where es.country="china" and es.state ="Asia"
三、動態分割槽:
為什麼要使用動態分割槽呢,我們舉個例子,假如中國有50個省,每個省有50個市,每個市都有100個區,那我們都要使用靜態分割槽要使用多久才能搞完。所有我們要使用動態分割槽。
動態分割槽預設是沒有開啟。開啟後預設是以嚴格模式執行的,在這種模式下需要至少一個分割槽欄位是靜態的。這有助於阻止因設計錯誤導致導致查詢差生大量的分割槽。列如:使用者可能錯誤使用時間戳作為分割槽表字段。然後導致每秒都對應一個分割槽!這樣我們也可以採用相應的措施:
關閉嚴格分割槽模式 動態分割槽模式時是嚴格模式,也就是至少有一個靜態分割槽。 set hive.exec.dynamic.partition.mode=nonstrict //分割槽模式,預設nostrict set hive.exec.dynamic.partition=true //開啟動態分割槽,預設true set hive.exec.max.dynamic.partitions=1000 //最大動態分割槽數,預設1000
1,建立一個普通動態分割槽表:
create table if not exists zxz_5( name string, nid int, phone string, ntime date ) partitioned by (year int,month int) row format delimited fields terminated by "|" lines terminated by "\n" stored as textfile;
現在還看不出來有什麼不一樣
insert overwrite table zxz_5 partition (year,month) select name,nid,phone,ntime,year(ntime) as year ,month(ntime) as month from zxz_dy; zxz_5這個表裡面存放著資料。 我們利用year,和month函式來獲取ntime列的年和月來作為分割槽,這個是靠我們查詢到資料來分割槽是不是很舒服
來我們看看他自動分割槽的格式