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

2021-08-01 07:17:03 字數 3635 閱讀 4003

關鍵字:hive 複製表

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;ok

pt=2015-09

-11pt=

2015-09

-12time

taken

:0.11

seconds

,fetched:2

row(s)

hive

>

desc t1;ok

id

string

pt

string

# partition information

# col_name data_type comment

pt

string

time

taken

:0.123

seconds

,fetched:7

row(s)

hive

>

select

*fromt1;

okx

2015-09

-11y

2015-09

-12time

taken

:0.095

seconds

,fetched:2

row(s)

hive

>

建立一張相同表結構的新錶t2;

hive

>

create table t2 like t1;ok

time

taken

:0.162

seconds

hive

>

desc t2;ok

id

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;ok

time

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;ok

time

taken

:0.082

seconds

hive

>

msck repair table t2;ok

partitions

notin

metastore:t2

:pt=2015-09

-11t2:

pt=2015-09

-12repair

:added

partition to metastore t2:pt

=2015-09

-11repair

:added

partition to metastore t2:pt

=2015-09

-12time

taken

:0.249

seconds

,fetched:3

row(s)

hive

>

show partitions t2;ok

pt=2015-09

-11pt=

2015-09

-12time

taken

:0.068

seconds

,fetched:2

row(s)

hive

>

select

*fromt2;

okx

2015-09

-11y

2015-09

-12time

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中有時候會遇到複製表的需求,複製表指的是複製表結構和資料。如果是針對非分割槽表,那很簡單,可以使用create table new table as select from old table 那麼如果是分割槽表呢?首先想到的辦法可能是 先建立一張和old table結構相同的new tab...

從一張表中複製資料到另一張表中

分為兩種情況,一種是目標表不存在,另一種是目標表已存在,語法是不同的。分別以sqlserver和oracle為例,兩者略有不同。sqlserver中,如果目標表不存在 select into新錶名from舊表名 sqlserver中,如果目標表已存在 insertinto新錶名select from...