IT 삽질기

Hive 테이블 복사하기 본문

BigData/Hadoop

Hive 테이블 복사하기

화이팅빌런 2021. 4. 7. 20:36

Hive 테이블을 복사하는 방법을 알아보도록 하자

 

Hive 테이블을 복사하는 방법은 다음과 같이 나뉜다

1. hive 테이블의 구조(partition) 복사해 새로운 테이블을 만드는 방법

2. hive partition정보는 가지고 오지 않고 데이터만 복사해 새로운 테이블에 넣는 방법

3. partition과 데이터를 모두 복사하는 방법

 

먼저 복사하려고 하는 hive Table에 partition이 있는지 알아보도록 하자

DESC [DB].[TABLE]
# ex) DESC tmp.aa

partition이 있는 테이블은 아래와 같이 표시된다

 

반대로 partition이 없는 테이블은 아래와 같이 표시된다

파티션이 없어 데이터만 복사하고자 하는 경우

새로운 테이블을 만들 때 CREATE - SELECT문을 통해 만들면 된다

CREATE TABLE [new_db].[new_table] AS SELECT * FROM [old_db].[old_table]
# ex) CREATE TABLE tmp.bb AS SELECT * FROM tmp.aa

 

파티션이 있는 테이블의 경우

새로운 테이블을 먼저 만든 후 데이터를 이관한다

CREATE TABLE [new_db].[new_table] LIKE [old_db].[old_table]
# ex) CREATE TABLE tmp.bb LIKE tmp.aa

위의 쿼리를 사용해 테이블을 만들면 원본에 있던 partition 정보까지 복사하여 새로운 테이블이 생성된다

 

partition정보를 포함한 데이터를 옮기기 위해서는 몇가지 설정이 필요하다

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

위의 설정이 무엇인지 하나씩 확인해보자 

먼저 hive.exec.dynamic.partition=true 설정은

데이터를 넣을 때 설정된 key 값에 따라 자동으로 partition을 생성해주는 옵션이다

위의 예에서 dt를 partition으로 설정했고 데이터를 insert할 때도 dt를 지정해주면 dt 값에 따라 새로운 partition이 동적으로 생성될 것이다

hive.exec.dynamic.partition.mode=nonstrict 역시 partition을 동적으로 생성하기 위해 필요한 설정값이며,

기본값은 strict이다

 

마지막으로 생성된 테이블에 데이터를 넣으면 partition을 포함한 테이블의 데이터까지 모두 새로운 테이블로 복사되게 된다

INSERT OVERWRITE TABLE [new_db].[new_table] PARTITION ([partition_column])
SELECT * FROM [old_db].[old_table]

# ex)
# INSERT OVERWRITE TABLE tmp.bb PARTITION (dt)
# SELECT * FROM tmp.aa

 

끝으로 정리해보자

1. hive 테이블의 구조(partition) 복사해 새로운 테이블을 만드는 방법

DESC [DB].[TABLE]
# ex) DESC tmp.aa

2. hive partition정보는 가지고 오지 않고 데이터만 복사해 새로운 테이블에 넣는 방법

CREATE TABLE [new_db].[new_table] AS SELECT * FROM [old_db].[old_table]
# ex) CREATE TABLE tmp.bb AS SELECT * FROM tmp.aa

3. partition과 데이터를 모두 복사하는 방법

CREATE TABLE [new_db].[new_table] LIKE [old_db].[old_table]
# ex) CREATE TABLE tmp.bb LIKE tmp.aa

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

INSERT OVERWRITE TABLE [new_db].[new_table] PARTITION ([partition_column])
SELECT * FROM [old_db].[old_table]

# ex)
# INSERT OVERWRITE TABLE tmp.bb PARTITION (dt)
# SELECT * FROM tmp.aa
Comments