想要複製一張非分區表,可使用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