想要复制一张非分区表,可使用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
咱们能够先复制出一张表结构和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