관리(managed) 테이블은 데이터의 수명을 Hive 가 쥔다. DROP TABLE 하면 디렉터리와 파일이 함께 사라진다. 외부(external) 테이블은 메타데이터만 관리하므로 테이블을 지워도 파일은 남는다.
Hive 3 이후에는 여기에 트랜잭션 성격이 더해진다. CREATE TABLE 로 만든 관리 테이블은 기본적으로 ACID(트랜잭션) 테이블이 되고 포맷은 ORC 로 강제된다. 외부 테이블은 트랜잭션이 아니며 포맷 제약이 없다. CDP 에서 "왜 내 테이블이 갑자기 ORC 가 됐나" 하는 상황은 대부분 이 기본값 때문이다.
관리 테이블과 외부 테이블은 warehouse 경로도 다르다.
/warehouse/tablespace/managed/hive/<db>.db/<table>
/warehouse/tablespace/external/hive/<db>.db/<table>
EXTERNAL 키워드를 쓰지 않으면 이미 관리 테이블이 된다. 별도의 강제 설정은 필요 없고, hive.default.table.type 같은 프로퍼티는 존재하지 않는다.
반대 방향, 즉 CREATE TABLE 을 예전처럼 외부 테이블로 만들고 싶을 때 쓰는 설정은 있다.
SET hive.create.as.external.legacy=true;
이 값은 세션에서 켜거나 HiveServer2 설정에 넣는다. 데이터베이스를 만든 뒤에 켜야 그 데이터베이스의 레거시 위치가 쓰인다.
포맷 기본값은 따로 있다.
SET hive.default.fileformat=TextFile;
SET hive.default.fileformat.managed=ORC;
외부 테이블이라도 DROP TABLE 시 데이터까지 지우게 하려면 프로퍼티를 준다.
CREATE EXTERNAL TABLE db.tbl (id INT)
STORED AS PARQUET
LOCATION '/data/tbl'
TBLPROPERTIES ('external.table.purge'='true');
CDP 로 올라오면서 기존의 비-ACID 관리 테이블은 외부 테이블로 변환됐다. 이때 메타스토어가 붙이는 표시가 TRANSLATED_TO_EXTERNAL=TRUE 다. DESCRIBE FORMATTED 에서 이 값이 보이면 "원래 관리 테이블이었는데 업그레이드 과정에서 외부 테이블로 바뀐 것"이라는 뜻이며, 파일 포맷과는 아무 관계가 없다. 이런 테이블은 보통 external.table.purge=true 도 함께 달고 있어 drop 하면 데이터가 지워진다.
Hive CLI 는 홈 디렉터리의 .hiverc 를 읽는다. Beeline 은 -i 로 초기화 스크립트를 준다.
beeline -u 'jdbc:hive2://hs2:10000/default' -i /etc/hive/init.sql
JDBC URL 에 직접 실어 보낼 수도 있다. 애플리케이션에서 접속마다 같은 설정을 걸어야 할 때 편하다.
jdbc:hive2://hs2:10000/default?hive.exec.dynamic.partition.mode=nonstrict
? 뒤의 값은 세션 설정(hiveconf)으로 적용된다. 서버 전체에 걸려면 hive-site.xml 에 넣는 것이 맞고, 이때 hive.conf.restricted.list 에 걸린 항목은 세션에서 덮어쓸 수 없다는 점을 염두에 둔다.
모든 CREATE TABLE 에 특정 TBLPROPERTIES 를 자동으로 붙이는 기능은 Hive 에 없다. 필요하면 테이블 생성 DDL 을 템플릿으로 관리한다.