Hive 動態分割槽 & 靜態分割槽
阿新 • • 發佈:2019-01-31
本文轉自:http://www.geedoo.info/hive-dynamic-partitions-and-static-partitioning.html
參考:http://www.crazyant.net/1197.html
參考:http://www.crazyant.net/1197.html
HIVE預設是靜態分割槽。但是有時候可能需要動態建立不同的分割槽來區分不同的分類。
HIVE中建立分割槽表沒有什麼複雜的分割槽型別(範圍分割槽、列表分割槽、hash分割槽、混合分割槽等)。分割槽列也不是表中的一個實際的欄位,而是一個或者多個偽列。意思是說在表的資料檔案中實際上並不儲存分割槽列的資訊與資料。
工作中使用動態分割槽的例子:
因為要給一個已經建立的表增加分割槽欄位(原表沒有分割槽或者需要多增加幾個分割槽,好多文件的增加分割槽都預設是增加分割槽欄位的值),而從文件中沒有增加分割槽欄位的內容,所以只好做表資料遷移了。
下面是表的SQL語句:
舊錶結構
CREATE
EXTERNAL TABLE db_stat.beauty_day_imei(imei string,mid string,f string,v string,s string,hid string,ip string,openudid string,tuid string, count
int,active int)
PARTITIONED
BY (time string)
ROW
FORMAT DELIMITED FIELDS TERMINATED BY '`'
STORED
AS TEXTFILE;
|
新表結構
CREATE
EXTERNAL TABLE db_stat.beauty_day_imei2(imei string,mid string,f string,v string,s string,hid string,ip string,openudid string,tuid string, count
int,active int)
PARTITIONED
BY (type string,time string)
ROW
FORMAT DELIMITED FIELDS TERMINATED BY '`'
STORED
AS TEXTFILE;
|
從舊錶轉移資料到新表
insert
overwrite table db_stat.beauty_day_imei2 partition(type= 'base' ,time)
select
* from db_stat.beauty_day_imei ;
|
注意上面的time欄位。在舊錶(db_stat.beauty_day_imei)中time是分割槽欄位,在新表(db_stat.beauty_day_imei2)中type和time是分割槽欄位。time資料直接從舊錶中取得,自動作為新表time的分割槽。而實質儲存的資料中沒用type和time欄位資料。
舊錶結構
CREATE
EXTERNAL TABLE db_stat.beauty_all_imei(imei string,clicks int,regisday int,modday int,userday int)
PARTITIONED
BY ( time string)
ROW
FORMAT DELIMITED FIELDS TERMINATED BY '`'
STORED
AS RCFILE;
|
新表結構
CREATE
EXTERNAL TABLE db_stat.beauty_all_imei2(imei string,clicks int,regisday int,modday int,userday int)
PARTITIONED
BY (type string, pt string , time string)
ROW
FORMAT DELIMITED FIELDS TERMINATED BY '`'
STORED
AS RCFILE;
|
從舊錶遷移資料到新表
insert
overwrite table db_stat.beauty_all_imei2 partition(type= 'base' ,pt= 'android' ,
time)
select
* from db_stat.beauty_all_imei ;
|
參考: