hive로 테이블 생성, 조회, 삭제

hive에는 내부 테이블(매니지드 테이블)과 외부 테이블이라고 불리는 테이블 저장 방식이 있다. 이에 대해 먼저 알아보자

hive 내부 테이블과 외부 테이블의 차이

내부 테이블과 외부 테이블의 차이점은 데이터 소유자가 hive이냐, 아니냐로 크게 구분할 수 있다. 아래 표를 보자.

내부 테이블 외부 테이블
- hive 속성(hive.metastore.warehouse.dir)에서 정의한 디렉터리의 하위 디렉터리를 만들어서 저장
- hive에서 테이블을 삭제하면 테이블 내의 데이터도 삭제된다.
- 테이블을 생성할 때, EXTERNAL 키워드를 사용하며, LOCATION절에서 지정한 위치에 데이터가 존재한다는 것을 hive에게 알려준다.
- hive에서 테이블을 삭제하면, hive 내에서 메타데이터만 삭제될 뿐 데이터는 그대로 존재한다.
_ 떄문에 중요한 데이터의 경우 실수를 방지하기 위해 외부 테이블로 만드는 것을 권장한다.

테이블의 속성이 내부 테이블인지 외부 테이블인지 확인할 수 있는 쿼리문은 아래와 같다.

DESCRIBE EXTENDED 테이블명;

이제 내부 테이블과 외부 테이블을 각각 생성, 조회, 삭제 해보자.


내부 테이블

테이블 생성

CREATE 쿼리문은 기존 DB와 같다. 하지만 CSV형식의 txt파일 데이터를 집어넣기 위해 아래와 같이 쿼리문을 만든다.

CREATE TABLE test
(col1 string, col2 string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

아래 명령어로 생성된 테이블의 스키마를 볼 수 있다.

show create table test;

이제 터미널로 가서 기본 경로인 /user/hive/warehouse/위치에 가서 테이블이 생성되었는지 확인해 보자.

$ hadoop fs -ls /user/hive/warehouse/
21/05/26 10:47:36 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
drwxrwxr-x   - hive      supergroup          0 2021-05-26 10:47 /user/hive/warehouse/test

데이터 생성 및 조회

아직 데이터를 넣어주지 않았기 때문에 test 안에는 아무것도 들어있지 않다. 아래와 같은 데이터 파일을 하나 생성하여 넣어주자.

# test.txt
a,b
a,b
a,b
a,b
a,b

hive에서 INSERT문을 통하여 데이터를 넣을 수도 있지만 row마다 집어넣으면 시간이 너무 오래 걸리므로, 아래와 같은 명령어로 파일로 만들어 집어 넣는 방법을 지향한다.

$ hadoop fs -put ./test.txt /user/hive/warehouse/test

위 명령어를 실행시킨 후 쿼리문으로 가서 조회를 해보면 데이터가 잘 들어와 있을 것이다.

SELECT * FROM test;

테이블 삭제

아래 쿼리문으로 테이블을 삭제해보자

DROP TABLE test;

위에서 말했듯이 내부 테이블은 데이터의 소유자가 hive이므로 테이블을 삭제하면 hadoop 상의 test 폴더와 그 안의 데이터도 함께 삭제된다. 아래 명령어로 확인해 보자

$ hadoop fs -ls /user/hive/warehouse/


외부 테이블

테이블 생성

이번엔 외부 테이블을 생성해 주자. 외부 테이블은 EXTERNAL을 사용하여 생성하고, LOCATION절을 통해 데이터 위치를 하이브에게 알려준다.

CREATE EXTERNAL TABLE test
(col1 string, col2 string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/user/hive/warehouse/test';

데이터 생성 및 조회

데이터 생성 및 조회 방법은 전과 동일하다.

$ hadoop fs -put ./test.txt /user/hive/warehouse/test

위 명령어를 실행시킨 후 쿼리문으로 가서 조회를 해보면 데이터가 잘 들어와 있을 것이다.

SELECT * FROM test;

테이블 삭제

아래 쿼리문으로 테이블을 삭제해보자

DROP TABLE test;

위에서 말했듯이 외부 테이블은 데이터의 소유자가 hive가 아니므로, 테이블을 삭제해도 메타 데이터만 삭제되고 실 데이터는 hadoop에 그대로 남아있다. 확인해 보자.

$ hadoop fs -ls /user/hive/warehouse/
21/05/26 10:47:36 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
drwxrwxr-x   - hive      supergroup          0 2021-05-26 10:47 /user/hive/warehouse/test

Tags:

Categories:

Updated:

Leave a comment