1. 程式人生 > >Hive 動態分割槽 & 靜態分割槽

Hive 動態分割槽 & 靜態分割槽

本文轉自:http://www.geedoo.info/hive-dynamic-partitions-and-static-partitioning.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 ;

參考: