hive中有時候會遇到複製表的需求,複製表指的是複製表結構和資料。
如果是針對非分割槽表,那很簡單,可以使用create table new_table as select * from old_table;
那麼如果是分割槽表呢?
首先想到的辦法可能是:
先建立一張和old_table結構相同的new_table,包括分割槽;可以使用create table new_table like old_table;
接下來使用動態分割槽,把old_table的資料insert到new_table中。
這個方法當然可以,但可能不是最快的。
其實可以這樣做:
1. create table new_table like old_table;
2. 使用hadoop fs -cp 命令,把old_table對應的hdfs目錄的資料夾全部拷貝到new_table對應的hdfs目錄下;
3. 使用msck repair table new_table;修復新錶的分割槽元資料;
看例子:
有一張分割槽表t1,只有兩個分割槽,每個分割槽中都有一條資料,如下:
hive>show partitions t1;okpt=2015-09-11
pt=2015-09-12
time taken:
0.11 seconds, fetched: 2
row(s)
hive>desc t1;
okid
string
pt string
# partition information
# col_name data_type comment
pt string
time taken:
0.123 seconds, fetched: 7
row(s)
hive> select *from t1;
okx
2015-09-11
y 2015-09-12
time taken:
0.095 seconds, fetched: 2
row(s)
hive>
建立一張相同表結構的新錶t2;
hive>create table t2 like t1;oktime taken:
0.162
seconds
hive>desc t2;
okid
string
pt string
# partition information
# col_name data_type comment
pt string
time taken:
0.139 seconds, fetched: 7
row(s)
hive>show partitions t2;
oktime taken:
0.082 seconds
使用hadoop fs -cp命令把t1對應hdfs目錄的所有資料夾複製到t2對應的hdfs目錄下:
[liuxiaowen@dev ~]$ hadoop fs -cp /hivedata/warehouse/liuxiaowen.db/t1/* /hivedata/warehouse/liuxiaowen.db/t2/
[liuxiaowen@dev ~]$ hadoop fs -ls /hivedata/warehouse/liuxiaowen.db/t2/
found 2 items
drwxr-xr-x - liuxiaowen liuxiaowen 0 2015-09-11 17:17 /hivedata/warehouse/liuxiaowen.db/t2/pt=2015-09-11
drwxr-xr-x - liuxiaowen liuxiaowen 0 2015-09-11 17:17 /hivedata/warehouse/liuxiaowen.db/t2/pt=2015-09-12
在hive用使用msck repair table t2;修復新錶t2的分割槽元資料;
hive>show partitions t2;oktime taken:
0.082
seconds
hive>msck repair table t2;
okpartitions not
in metastore: t2:pt=2015-09-11 t2:pt=2015-09-12
repair: added partition to metastore t2:pt=2015-09-11
repair: added partition to metastore t2:pt=2015-09-12
time taken:
0.249 seconds, fetched: 3
row(s)
hive>show partitions t2;
okpt=2015-09-11
pt=2015-09-12
time taken:
0.068 seconds, fetched: 2
row(s)
hive> select *from t2;
okx
2015-09-11
y 2015-09-12
time taken:
0.123 seconds, fetched: 2
row(s)
hive>
ok,新錶t2已經複製好了,它和t1有著相同的表結構,分割槽結構,分割槽以及資料。
Hive中如何快速的複製一張分割槽表(包括資料)
關鍵字 hive 複製表 hive中有時候會遇到複製表的需求,複製表指的是複製表結構和資料。如果是針對非分割槽表,那很簡單,可以使用create table new table as select from old table 那麼如果是分割槽表呢?首先想到的辦法可能是 先建立一張和old tabl...
Hive中如何快速的複製一張分割槽表(包括資料)
關鍵字 hive 複製表 hive中有時候會遇到複製表的需求,複製表指的是複製表結構和資料。如果是針對非分割槽表,那很簡單,可以使用create table new table as select from old table 那麼如果是分割槽表呢?首先想到的辦法可能是 先建立一張和old tabl...
從一張表中複製資料到另一張表中
分為兩種情況,一種是目標表不存在,另一種是目標表已存在,語法是不同的。分別以sqlserver和oracle為例,兩者略有不同。sqlserver中,如果目標表不存在 select into新錶名from舊表名 sqlserver中,如果目標表已存在 insertinto新錶名select from...