Hive中如何快速的複製一張分割槽表(包括資料)

2022-04-30 19:00:06 字數 2795 閱讀 4672

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...