大資料開發之Hive篇----分割槽表的構建
在hive當中為什麼要分割槽呢?就是要提高我們的查詢速度,那麼它是怎麼提高查詢速度的呢?首先,分割槽是指根據某個或幾個欄位來將資料表格切分成多個板塊,根據你所指定的欄位,這個欄位裡面有多少個值,我們就將分割槽建成多少個。所以,分割槽其實是在表這個單位下的下一個單位。因此,在HDFS上面分割槽也是一個目錄。
所以分割槽欄位是什麼值這一批資料將落入到什麼的分割槽目錄下,不知道我這麼解釋小夥伴們能否很好的理解呢?
那麼分割槽構建也有兩種,分別是靜態分割槽和動態分割槽。我們先來看看構建分割槽表的建表語法:
create table tab_name(col_name_1 data_type,col_name_2 data_type,......) partitioned by (col_name_partition data_type) row format delimited fields terminated by '...'; 這裡我們需要明確的是,你的分割槽欄位是不能出現在表結構欄位裡面的,這是一定一定要記得的。
當我們已經構建好了,我們需要把資料載入到表裡面了吧。之前我們使用的載入資料是使用語法:load data [local] inpath '....' [overwrite] into table tab_name,如果是分割槽表的話,就在後面再加上 partition (col_name_partition = col_value ...),分割槽欄位可以是多個的。這樣你所要載入的資料將全部進入到這個分佈目錄當中,在HDFS上面也同時在表所對應的目錄下生成一個分割槽目錄,裡面將放置你的資料。
但這種方法不好的地方是,如果我希望我是按照表資料裡的某個以存在的欄位來構建分割槽欄位的話,那麼怎麼辦呀?這個時候的資料也沒喲scheme這個鬼,只能將全部資料載入到一個分割槽中,這個分割槽欄位還不能出現在表字段當中。
這個時候我們可以先為我們的資料構建一個表結構,我們再建立一個分割槽表來重新載入這些資料。建立分割槽表的語法格式和上面一樣。只是這個時候我們希望使用資料中某列作為分割槽欄位,那麼在構建表結構的時候就不要再寫入這個列的欄位名稱了。
然後我們使用insert into table tab_name_1 partition (col_name_partition = col_value) select col_name_1,.... from tab_name where col_name_partition = col_value;這樣就可以將特定的分割槽欄位值的資料放入到專門的分割槽表當中了。在這裡select後面的欄位是不能出現將用於充當分割槽欄位的原表字段的。
以上的這個方法是按照不同的值一個一個地手動輸入的,如果分割槽欄位有1000個值,或者我們有多個分割槽欄位某每一個分割槽欄位都有多個值,那麼我們手動輸入還不累死,這個在工作當中我們所要付出的代價就是加班。
所以hive也提供了一種動態分割槽的匯入資料的方法。 insert into table tab_name_1 partition (col_name_partition) select col_name_1,.....,col_name_partition from tab_name; 這裡分割槽欄位是要出現在select的後面的,而且是所有欄位的最後面,而前面的partition裡面的欄位就不指定具體的值了,這樣當匯入資料的時候系統將自動計算有多少個分割槽要建立了。
下面是一個簡單的例子:
create table table_1(id int,name string,age int) row format delimited fields terminated by '\t';
這裡我們為資料構建一個表,我們的資料裡面有id,name,age這三個欄位。現在我們打算再為這個資料構建一個以age為分割槽欄位的分割槽表,所以我們還要重新建立一個分割槽表並以動態分割槽匯入資料。
create table table_2(id int,name string) partitioned by(age int) row format delimited fields terminated by '\t';
isnert into table table_2 partition(age) select id,name,age from table_1;
注意分割槽欄位age我是放在select的最後面的,雖然它本來就是在最後面的。
如果我們要使用靜態匯入的話,假設我們的age有三個值,分別是10,20,30。那麼我們就要這樣構建了:
insert into table table_2 partition(age=10) select id,name from age=10;
insert into table table_2 partition(age=20) select id,name from age=20;
insert into table table_2 partition(age=30) select id,name from age=30;
這樣根據分割槽欄位值一個一個匯入,同時在select裡面是不能出現作為分割槽欄位的那個欄位的。
如果你們想在原來的基礎上在新增一個新的分割槽目錄,可以直接在HDFS上面mkdir -p一個新的分割槽目錄,但目錄名稱要按格式來定義,然後在hive這裡使用語法:alter table table_2 add partition (col_name_partition = col_value_new),如果前面沒有mkdir -p手動新增目錄的話就在後面繼續些上location '....' 指定的路徑吧。