Hive 表的複製 & 新增字段

非分區表的複製

想要複製一張非分區表,可使用create tale as去解決。sql

假如咱們有一張temp表,爲普通的內部表.複製能夠採用以下的語句:數據庫

create table temp1 as select * from temp;

這樣就複製出一張和temp結構一致的表(temp1)。session

分區表的複製

分區表若是採用這種create…as…的方法去複製,數據也能夠複製成功,可是表的結構是錯誤的,他會變成一個非分區表。要想實現分區表的複製,有下面2種方法:spa

動態分區

咱們能夠建一張和temp擁有同樣表結構的表,而後使用動態分區的方法把數據導入:.net

create table temp2 like temp;
insert overwrite  table  temp2 partition(year,month)
select id,name,date,substring(date,1,4),substring(date,6,2) from temp;

執行後能夠獲得和以前同樣的分區表,可是這種方法並非最快的方法 。code

msck修復分區

咱們能夠先複製出一張表結構和temp同樣的表,而後將temp表目錄下的數據複製到temp2,而後使用分區表的msck指令去從新生成分區。orm

create table temp2 like temp;
dfs -cp /user/hive/warehouse/test.db/temp/* /user/hive/warehouse/test.db/temp2/;
msck repair table temp2;

使用這樣的方法一樣能夠快速的複製分區表,並且這樣操做的速度比使用動態分區要快,由於咱們移動數據是使用hdfs的文件複製,而不是啓動mapreduce做業。blog

 

Hive分區表新增字段原始表:get

hive (default)> desc dev.test1;  
col_name    data_type
path_id     string    
session_id  string    
gu_id       string    
end_user_id string    
ds          string

在上表中新增兩個字段platform_id、tpa,類型均爲int類型:input

hive (pms)> alter table dev.test1 add columns(platform_id int, tpa int);  
FAILED: cannot recognize input near 'dev' '.' 'test1' in alter table statement

這樣執行(有時候)會有問題,數據庫名默認不支持,換種寫法便可。

hive (dev)> use dev;                                                                     
hive (dev)> alter table test1 add columns(platform_id int, tpa int);

新增的字段將加到該表的最後,分區字段以前而且在之前的分區中這兩個字段都爲NULL

hive (default)> desc dev.test1;  
col_name       data_type
path_id        string      
session_id     string    
gu_id          string    
end_user_id    string    
platform_id    int     -- 新增字段
tpa            int     -- 新增字段
ds             string
相關文章
相關標籤/搜索