HiveQL 데이터 정의 언어
HiveQL 데이터 정의 언어 (LanguageManual DDL)
HiveQL의 데이터 정의 언어(DDL)는 데이터베이스·테이블·뷰·함수·인덱스 같은 스키마 객체를 만들고 관리하는 문장들이에요. 데이터가 실제로 어디에 어떻게 저장되는지를 정의하는 기초라서, DML을 쓰기 전에 이 구조가 어떻게 잡히는지 이해하는 게 중요해요.
출처: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
DDL은 이렇게 구성돼 있어요. CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX, DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX, TRUNCATE TABLE, ALTER DATABASE/SCHEMA, TABLE, VIEW, MSCK REPAIR TABLE(또는 ALTER TABLE RECOVER PARTITIONS), SHOW ..., DESCRIBE .... PARTITION 문장은 SHOW PARTITIONS를 제외하면 대부분 TABLE 문장의 옵션으로 들어가요.
데이터베이스를 만들 때는 CREATE [REMOTE] (DATABASE|SCHEMA) [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [MANAGEDLOCATION hdfs_path] [WITH DBPROPERTIES (property_name=property_value, ...)]; 형태예요. 여기서 SCHEMA와 DATABASE는 상호 교환 가능한 같은 뜻이에요. Hive 4.0.0부터 MANAGEDLOCATION이 추가됐는데, LOCATION은 이제 외부 테이블의 기본 디렉터리를, MANAGEDLOCATION은 관리 테이블의 기본 디렉터리를 뜻해요.
데이터베이스를 지울 때는 DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];를 써요. 기본 동작은 RESTRICT라서 데이터베이스가 비어 있지 않으면 실패해요. 데이터베이스 안의 테이블까지 같이 지우려면 DROP DATABASE ... CASCADE를 사용해요.
테이블 생성이 핵심이에요. 기본 형태는 CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name ...이고, 컬럼 정의와 함께 파티셔닝(PARTITIONED BY), 버킷팅(CLUSTERED BY ... INTO ... BUCKETS), 행 포맷(ROW FORMAT), 스토리지(STORED AS)를 지정할 수 있어요. EXTERNAL 키워드는 테이블이 외부 파일을 참조한다는 뜻이고, 관리 테이블(managed)은 Hive가 데이터를 소유하는 반면 외부 테이블(external)은 Hive가 데이터를 소유하지 않아요.
예약 키워드(Reserved Keywords)는 버전마다 조금씩 달라져요. 예를 들어 REGEXP와 RLIKE는 Hive 2.0.0부터 예약 키워드가 됐어요. 예약 키워드를 식별자로 쓰고 싶다면 따옴표로 감싸는 방식(quoted identifier, 0.13.0+)을 쓰거나 hive.support.sql11.reserved.keywords=false를 설정할 수 있어요(2.1.0까지).
파티션 관리를 위해 ALTER TABLE ... ADD PARTITION, DROP PARTITION, RENAME PARTITION, EXCHANGE PARTITION 같은 문장을 써요. 그리고 파티션 메타데이터가 저장소와 맞지 않을 땐 MSCK REPAIR TABLE(또는 ALTER TABLE RECOVER PARTITIONS)로 파티션을 복구해요. 테이블 데이터를 비울 때는 TRUNCATE [TABLE] table_name [PARTITION partition_spec];을 쓰는데, Hive 4.0부터 TABLE 토큰이 선택 사항이 됐어요.
ALTER TABLE로는 이름 변경(RENAME TO), 속성 변경(SET TBLPROPERTIES), SerDe 속성 추가·제거, 저장 속성 변경, 컬럼 이름·타입·위치·주석 변경(CHANGE COLUMN), 컬럼 추가·교체(ADD/REPLACE COLUMNS) 등을 할 수 있어요. ALTER DATABASE ... SET LOCATION은 데이터베이스의 새 테이블이 들어갈 기본 부모 디렉터리만 바꾸며 기존 데이터를 옮기지 않아요.
더 알아보기
- 생성한 테이블에 데이터를 넣는 방법은 LanguageManual DML에서
- 파티션·버킷 개념은 File Formats와 Creating Tables 문서에서