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
相关文章
相关标签/搜索