Hive 테이블


하이브 테이블은 저장된 데이터테이블에서 데이터의 LAYOUT을 기술하는 관련 메타데이터로 논리적으로 구성된다. 데이터는 로컬 파일시스템이나 S3를 포함하여 어떠한 하둡 파일 시스템에도 둘 수 있지만 일반적으로 HDFS에 둔다. 하이브는 HDFS가 아닌 관계형 데이터베이스에 메타데이터를 저장한다.


다중 데이터베이스/스키마 지원

많은 관계형 데이터베이스는 사용자와 어플리케이션이 다수의 데이터베이스나 스키마로 분리될 수 있도록 다중 네임스페이스 기능을 지원한다. 하이브 역시 다중 네임스페이스 기능을 지원하고 CREATE DATABASE dbname, USE dbname, DROP DATABASE dbname과 같은 명령을 제공한다. 데이터베이스를 포함한 테이블 이름을 사용하고 싶으면 dbname.tablename 형식으로 지정하면 된다. 데이터베이스를 지정하지 않으면 테이블은 default 데이터베이스에 포함된다.



관리 테이블과 외부 테이블

테이블을 생성할 때 하이브는 기본적으로 데이터를 직접 관리하게 되는데, 이는 하이브가 데이터를 자신이 관리하는 웨어하우스 디렉터리로 이동시킨다는 의미다. 반대로 사용자는 외부테이블을 생성하여 웨어하우스 디렉터리 외부의 데이터를 참조할 수 도 있다.

두 종류의 테이블은 LOAD와 DROP에 대한 해석에서 차이점이 있다. 사용자가 데이터를 관리 테이블에 로드할 때 그 데이터는 하이브의 웨어하우스 디렉터리로 이동하게 된다.

CREATE TABLE managed_table (dummy STRING);
LOAD DATA INPAYH '/usr/tom/data.txt' INTO TABLE managed_table;

LOAD 연산은 파일시스템에서 파일을 단순히 이동시키거나 이름을 변경하는 것이기 때문에 매우 빠르다. 하지만 하이브는 해당 테이블의 디렉터리에 잇는 파일과 관리 테이블을 위해 선언된 스키마의 정합성을 미리 점검하지 않는다는 사실을 잊어서는 안된다. 만일 정합성에 문제가 있다면 쿼리 시점에 누락된 필드에 대해 NULL을 반환한다. 사용자는 테이블에서 몇 개의 행을 얻을 수 있는 SELECT 구문을 실행하여 데이터가 제대로 해석되는지 검증할 수 있다.

DROP TABLE managed_table;

DROP 구문으로 테이블을 제거하면 메타스토어와 함께 그 데이터도 삭제된다. LOAD 구문은 파일의 이동 조작 수행, DROP은 파일의 삭제 조작을 수행한 것이기 때문에 데이터는 어디에도 존재하지 않는다.

외부 테이블은 관리 테이블과 다르며 사용자가 데이터의 생성과 삭제를 직접 제어해야 한다. 외부 데이터의 위치는 테이블을 생성하는 시점에 지정된다.

CREATE EXTERNAL TABLE external_table (dummy STRING)
LOCATION '/usr/tom/external_table';
LOAD DATA INPATH '/usr/tom/data.txt' INTO TABLE external_table;

테이블을 생성할 때 EXTERNAL 키워드를 추가하면 하이브는 데이터를 직접 관리할 필요가 없기 때문에 그 데이터를 웨어하우스 디렉터리로 이동시키지 않는다. 사실 하이브는 테이블을 선언하는 시점에 외부 테이블의 디렉터리가 존재하는지 여부도 확인하지 않는다. 이렇게 하면 테이블을 생성한 후 데이터를 생성해도 문제가 없다.

외부 테이블을 삭제할 때 하이브는 데이터는 절대 건드리지 않고 메타데이터만 삭제한다.

따라서 어떤 종류의 테이블을 생성할지 선택할 필요가 있다. drop을 해석하는 방법은 다르지만 두 종류의 테이블은 큰 차이가 없기 때문에 이것은 선호의 문제가 된다. 하이브에서만 데이터를 처리한다면 관리 테이블을, 동일한 데이터셋을 하이브를 비롯해서 다른 도구와 함께 사용한다면 외부 테이블을 주로 선택한다. 일반적으로 HDFS에 다른 프로세스가 생성하여 저장한 초기 데이터셋을 접근할 때는 외부 테이블을 사용하고, 나중에 그 데이터를 하이브 관리 테이블로 이동시킬 때는 하이브 변환을 사용할 수 있다. 데이터를 다른 어플리케이션에서 사용할 수 있도록 익스포트할 때 외부 테이블을 사용할 수도 있다.

외부 테이블을 사용하는 또 다른 이유는 동일한 데이터셋관 관련된 다중 스키마를 적용하기 위해서다.