Hive 表的复制 & 新增字段

非分区表的复制

想要复制一张非分区表,可以使用create tale as去解决。

假如我们有一张temp表,为普通的内部表.复制可以采用如下的语句:

create table temp1 as select * from temp;

这样就复制出一张和temp结构一致的表(temp1)。

分区表的复制

分区表如果采用这种create…as…的方法去复制,数据也可以复制成功,但是表的结构是错误的,他会变成一个非分区表。要想实现分区表的复制,有下面2种方法:

动态分区

我们可以建一张和temp拥有一样表结构的表,然后使用动态分区的方法把数据导入:

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;

执行后可以得到和之前一样的分区表,但是这种方法并不是最快的方法 。

msck修复分区

我们可以先复制出一张表结构和temp一样的表,然后将temp表目录下的数据复制到temp2,然后使用分区表的msck指令去重新生成分区。

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作业。

Hive分区表新增字段原始表:

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类型:

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    

猜你喜欢

转载自my.oschina.net/u/3204727/blog/1647815