LanguageManual DDL

LanguageManual DDL

HiveQL의 DDL(Data Definition Language) 문장들을 설명해요. 데이터베이스/테이블/뷰/함수/인덱스 만들기와 삭제, 테이블 변경, 파티션 관리, 각종 SHOW/DESCRIBE 명령까지 Hive의 메타데이터 관리를 폭넓게 다룹니다.

출처: 문서

본문

개요(Overview)

HiveQL 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 DATABASES/SCHEMAS, TABLES, TBLPROPERTIES, VIEWS, PARTITIONS, FUNCTIONS, INDEX[ES], COLUMNS, CREATE TABLE
  • DESCRIBE DATABASE/SCHEMA, table_name, view_name, materialized_view_name

PARTITION 문장은 보통 TABLE 문장의 옵션이며, SHOW PARTITIONS만 예외입니다.

키워드, 비예약 키워드, 예약 키워드(Keywords, Non-reserved Keywords and Reserved Keywords)

Version Non-reserved Keywords
Hive 1.2.0 ADD, ADMIN, AFTER, ANALYZE, ARCHIVE, ASC, BEFORE, BUCKET, BUCKETS, CASCADE, CHANGE, CLUSTER, CLUSTERED, CLUSTERSTATUS, COLLECTION, COLUMNS, COMMENT, COMPACT, COMPACTIONS, COMPUTE, CONCATENATE, CONTINUE, DATA, DATABASES, DATETIME, DAY, DBPROPERTIES, DEFERRED, DEFINED, DELIMITED, DEPENDENCY, DESC, DIRECTORIES, DIRECTORY, DISABLE, DISTRIBUTE, ENABLE, ESCAPED, EXCLUSIVE, EXPLAIN, EXPORT, FIELDS, FILE, FILEFORMAT, FIRST, FORMAT, FORMATTED, FUNCTIONS, HOLD_DDLTIME, HOUR, IDXPROPERTIES, IGNORE, INDEX, INDEXES, INPATH, INPUTDRIVER, INPUTFORMAT, ITEMS, JAR, KEYS, LIMIT, LINES, LOAD, LOCATION, LOCK, LOCKS, LOGICAL, LONG, MAPJOIN, MATERIALIZED, METADATA, MINUS, MINUTE, MONTH, MSCK, NOSCAN, NO_DROP, OFFLINE, OPTION, OUTPUTDRIVER, OUTPUTFORMAT, OVERWRITE, OWNER, PARTITIONED, PARTITIONS, PLUS, PRETTY, PRINCIPALS, PROTECTION, PURGE, READ, READONLY, REBUILD, RECORDREADER, RECORDWRITER, REGEXP, RELOAD, RENAME, REPAIR, REPLACE, REPLICATION, RESTRICT, REWRITE, RLIKE, ROLE, ROLES, SCHEMA, SCHEMAS, SECOND, SEMI, SERDE, SERDEPROPERTIES, SERVER, SETS, SHARED, SHOW, SHOW_DATABASE, SKEWED, SORT, SORTED, SSL, STATISTICS, STORED, STREAMTABLE, STRING, STRUCT, TABLES, TBLPROPERTIES, TEMPORARY, TERMINATED, TINYINT, TOUCH, TRANSACTIONS, UNARCHIVE, UNDO, UNIONTYPE, UNLOCK, UNSET, UNSIGNED, URI, USE, UTC, VIEW, WHILE, YEAR
Hive 2.0.0 removed: HOLD_DDLTIME, IGNORE, NO_DROP, OFFLINE, PROTECTION, READONLY, REGEXP, RLIKE added: AUTOCOMMIT, ISOLATION, LEVEL, OFFSET, SNAPSHOT, TRANSACTION, WORK, WRITE
Hive 2.1.0 added: ABORT, KEY, LAST, NORELY, NOVALIDATE, NULLS, RELY, VALIDATE
Hive 2.2.0 removed: MINUS added: CACHE, DAYS, DAYOFWEEK, DUMP, HOURS, MATCHED, MERGE, MINUTES, MONTHS, QUARTER, REPL, SECONDS, STATUS, VIEWS, WEEK, WEEKS, YEARS
Hive 2.3.0 removed: MERGE added: DETAIL, EXPRESSION, OPERATOR, SUMMARY, VECTORIZATION, WAIT
Hive 3.0.0 removed: PRETTY added: ACTIVATE, ACTIVE, ALLOC_FRACTION, CHECK, DEFAULT, DO, ENFORCED, KILL, MANAGEMENT, MAPPING, MOVE, PATH, PLAN, PLANS, POOL, QUERY, QUERY_PARALLELISM, REOPTIMIZATION, RESOURCE, SCHEDULING_POLICY, UNMANAGED, WORKLOAD, ZONE
Hive 3.1.0 N/A
Hive 4.0.0 added: AST, AT, BRANCH, CBO, COST, CRON, DCPROPERTIES, DEBUG, DISABLED, DISTRIBUTED, ENABLED, EVERY, EXECUTE, EXECUTED, EXPIRE_SNAPSHOTS, IGNORE, JOINCOST, MANAGED, MANAGEDLOCATION, OPTIMIZE, REMOTE, RESPECT, RETAIN, RETENTION, SCHEDULED, SET_CURRENT_SNAPSHOT, SNAPSHOTS, SPEC, SYSTEM_TIME, SYSTEM_VERSION, TAG, TRANSACTIONAL, TRIM, TYPE, UNKNOWN, URL, WITHIN

버전 정보

REGEXPRLIKE는 Hive 2.0.0 이전에는 비예약 키워드였고, Hive 2.0.0부터는 예약 키워드예요 (HIVE-11703).

예약 키워드는 특정 방법으로 따옴표를 붙이면 식별자로 사용할 수 있어요 (Supporting Quoted Identifiers in Column Names 참고, 0.13.0 이상, HIVE-6013). 대부분의 키워드는 문법의 모호성을 줄이기 위해 HIVE-6617을 통해 예약되었어요 (1.2.0 이상). 그래도 예약 키워드를 식별자로 쓰고 싶다면 두 가지 방법이 있어요: (1) 따옴표 붙인 식별자 사용, (2) hive.support.sql11.reserved.keywords=false 설정 (2.1.0 이하).

Create/Drop/Alter/Use Database

Create Database

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는 서로 바꿔 쓸 수 있어요. CREATE DATABASE는 Hive 0.6에 추가됐어요 (HIVE-675). WITH DBPROPERTIES 절은 Hive 0.7에 추가됐어요 (HIVE-1836).

MANAGEDLOCATION은 Hive 4.0.0에 데이터베이스에 추가됐어요 (HIVE-22995). 이제 LOCATION은 외부(external) 테이블의 기본 디렉터리를, MANAGEDLOCATION은 관리형(managed) 테이블의 기본 디렉터리를 뜻합니다. 모든 관리형 테이블이 공통 거버넌스 정책을 적용할 공통 루트를 갖도록 MANAGEDLOCATION을 metastore.warehouse.dir 안에 두는 걸 권장해요. metastore.warehouse.tenant.colocation과 함께 사용해 웨어하우스 루트 디렉터리 밖을 가리키게 해 테넌트 기반 공통 루트를 둘 수도 있습니다.

REMOTE 데이터베이스는 Hive 4.0.0 (HIVE-24396)에 Data connector 지원을 위해 추가됐어요.

Drop Database

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

SCHEMA와 DATABASE는 서로 바꿔 쓸 수 있어요. DROP DATABASE는 Hive 0.6에 추가됐어요 (HIVE-675). 기본 동작은 RESTRICT로, 데이터베이스가 비어 있지 않으면 DROP DATABASE가 실패합니다. 데이터베이스의 테이블도 함께 삭제하려면 DROP DATABASE ... CASCADE를 사용하세요. RESTRICT와 CASCADE 지원은 Hive 0.8에 추가됐어요 (HIVE-2090).

Alter Database

ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);   -- (Note: SCHEMA added in Hive 0.14.0)

ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;   -- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)

ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path; -- (Note: Hive 2.2.1, 2.4.0 and later)

ALTER (DATABASE|SCHEMA) database_name SET MANAGEDLOCATION hdfs_path; -- (Note: Hive 4.0.0 and later)

SCHEMA와 DATABASE는 서로 바꿔 쓸 수 있어요. ALTER SCHEMA는 Hive 0.14에 추가됐어요 (HIVE-6601).

ALTER DATABASE ... SET LOCATION 문은 데이터베이스의 현재 디렉터리 내용을 새 위치로 옮기지 않아요. 지정 데이터베이스 아래의 테이블/파티션에 연결된 위치도 바꾸지 않습니다. 이 문은 이 데이터베이스에 새 테이블이 추가될 때의 기본 부모 디렉터리만 바꿔요. 이는 테이블 디렉터리를 바꿔도 기존 파티션을 다른 위치로 옮기지 않는 동작과 유사합니다.

ALTER DATABASE ... SET MANAGEDLOCATION 문은 데이터베이스의 관리형 테이블 디렉터리 내용을 새 위치로 옮기지 않아요. 마찬가지로 새 테이블이 추가될 기본 부모 디렉터리만 바꿉니다.

데이터베이스의 다른 메타데이터는 변경할 수 없어요.

Use Database

USE database_name;
USE DEFAULT;

USE는 이후 모든 HiveQL 문장의 현재 데이터베이스를 설정해요. 기본 데이터베이스로 되돌리려면 데이터베이스 이름 대신 "default" 키워드를 사용하세요. 현재 사용 중인 데이터베이스를 확인하려면 SELECT current_database() (Hive 0.13.0 이상).

USE database_name은 Hive 0.6에 추가됐어요 (HIVE-675).

Create/Drop/Alter Connector

Create Connector

CREATE CONNECTOR [IF NOT EXISTS] connector_name
  [TYPE datasource_type]
  [URL datasource_url]
  [COMMENT connector_comment]
  [WITH DCPROPERTIES (property_name=property_value, ...)];

Hive 4.0.0 (HIVE-24396)부터 Data connector 지원이 추가됐어요. 초기 커밋에는 MYSQL, POSTGRES, DERBY 같은 JDBC 기반 데이터소스용 커넥터 구현이 포함됩니다. 추가 구현은 후속 커밋으로 이어집니다.

  • TYPE - 이 커넥터가 연결하는 원격 데이터소스의 타입 (예: MYSQL). 타입은 Driver 클래스와 이 데이터소스에 특화된 다른 파라미터를 결정해요.
  • URL - 원격 데이터소스의 URL. JDBC 데이터소스라면 JDBC 연결 URL이 되고, hive 타입이라면 thrift URL이 돼요.
  • COMMENT - 이 커넥터에 대한 짧은 설명.
  • DCPROPERTIES - 커넥터에 설정되는 name/value 쌍 집합. 원격 데이터소스의 자격증명은 JDBC Storage Handler 문서에 나온 대로 DCPROPERTIES의 일부로 지정해요. "hive.sql" 접두사로 시작하는 모든 속성은 이 커넥터로 매핑된 테이블에 추가됩니다.

Drop Connector

DROP CONNECTOR [IF EXISTS] connector_name;

Hive 4.0.0 (HIVE-24396)부터. 이 커넥터로 매핑된 데이터베이스가 있어도 drop은 성공해요. 매핑된 데이터베이스에서 "show tables" 같은 DDL을 실행하면 오류가 보입니다.

Alter Connector

ALTER CONNECTOR connector_name SET DCPROPERTIES (property_name=property_value, ...);

ALTER CONNECTOR connector_name SET URL new_url;

ALTER CONNECTOR connector_name SET OWNER [USER|ROLE] user_or_role;

Hive 4.0.0 (HIVE-24396)부터.

  • ALTER CONNECTOR ... SET DCPROPERTIES는 기존 속성을 ALTER DDL에 지정된 새 속성 집합으로 대체해요.
  • ALTER CONNECTOR ... SET URL은 원격 데이터소스의 기존 URL을 새 URL로 대체합니다. 커넥터로 만든 REMOTE 데이터베이스는 이름으로 연결되므로 계속 동작해요.
  • ALTER CONNECTOR ... SET OWNER는 hive의 커넥터 객체 소유권을 변경합니다.

Create/Drop/Truncate Table

하위 섹션: Create Table, Managed and External Tables, Storage Formats, Row Formats & SerDe, Partitioned Tables, External Tables, Create Table As Select (CTAS), Create Table Like, Bucketed Sorted Tables, Skewed Tables, Temporary Tables, Transactional Tables, Constraints, Drop Table, Truncate Table.

Create Table

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)
  [(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [SKEWED BY (col_name, col_name, ...)                 -- (Note: Available in Hive 0.10.0 and later)]
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [ROW FORMAT row_format] 
   [STORED AS file_format]
     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)
  [AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  LIKE existing_table_or_view_name
  [LOCATION hdfs_path];
data_type
  : primitive_type
  | array_type
  | map_type
  | struct_type
  | union_type  -- (Note: Available in Hive 0.7.0 and later)

primitive_type
  : TINYINT
  | SMALLINT
  | INT
  | BIGINT
  | BOOLEAN
  | FLOAT
  | DOUBLE
  | DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)
  | STRING
  | BINARY      -- (Note: Available in Hive 0.8.0 and later)
  | TIMESTAMP   -- (Note: Available in Hive 0.8.0 and later)
  | DECIMAL     -- (Note: Available in Hive 0.11.0 and later)
  | DECIMAL(precision, scale)  -- (Note: Available in Hive 0.13.0 and later)
  | DATE        -- (Note: Available in Hive 0.12.0 and later)
  | VARCHAR     -- (Note: Available in Hive 0.12.0 and later)
  | CHAR        -- (Note: Available in Hive 0.13.0 and later)

array_type
  : ARRAY < data_type >

map_type
  : MAP < primitive_type, data_type >

struct_type
  : STRUCT < col_name : data_type [COMMENT col_comment], ...>

union_type
   : UNIONTYPE < data_type, data_type, ... >  -- (Note: Available in Hive 0.7.0 and later)

row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char]   -- (Note: Available in Hive 0.13 and later)
  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

file_format:
  : SEQUENCEFILE
  | TEXTFILE    -- (Default, depending on hive.default.fileformat configuration)
  | RCFILE      -- (Note: Available in Hive 0.6.0 and later)
  | ORC         -- (Note: Available in Hive 0.11.0 and later)
  | PARQUET     -- (Note: Available in Hive 0.13.0 and later)
  | AVRO        -- (Note: Available in Hive 0.14.0 and later)
  | JSONFILE    -- (Note: Available in Hive 4.0.0 and later)
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

column_constraint_specification:
  : [ PRIMARY KEY|UNIQUE|NOT NULL|DEFAULT [default_value]|CHECK  [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]

default_value:
  : [ LITERAL|CURRENT_USER()|CURRENT_DATE()|CURRENT_TIMESTAMP()|NULL ]  

constraint_specification:
  : [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE 
    [, CONSTRAINT constraint_name UNIQUE (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, CONSTRAINT constraint_name CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]

CREATE TABLE은 주어진 이름의 테이블을 만들어요. 같은 이름의 테이블이나 뷰가 이미 있으면 오류를 던집니다. IF NOT EXISTS로 오류를 건너뛸 수 있어요.

  • 테이블 이름과 컬럼 이름은 대소문자를 구분하지 않지만, SerDe와 속성 이름은 대소문자를 구분해요.
  • Hive 0.12 및 이전에는 테이블과 컬럼 이름에 영숫자와 밑줄만 허용됐어요.
  • Hive 0.13 이상에서는 컬럼 이름에 모든 유니코드 문자를 쓸 수 있어요 (HIVE-6013). 다만 점(.)과 콜론(:)은 쿼리에서 오류를 만들므로 Hive 1.2.0에서 금지됐어요 (HIVE-10120). 백틱(`) 안에 지정된 컬럼 이름은 문자 그대로 취급됩니다. 백틱 문자열 안에서 백틱 문자를 표현하려면 이중 백틱( ``)을 쓰세요. 백틱 인용은 테이블과 컬럼 식별자로 예약 키워드를 쓸 수 있게도 해줍니다.
  • 0.13.0 이전 동작으로 되돌리고 컬럼 이름을 영숫자·밑줄로 제한하려면 hive.support.quoted.identifiers 구성 속성을 none으로 설정하세요. 이 구성에서는 백틱 이름이 정규식으로 해석됩니다.
  • 테이블/컬럼 코멘트는 (작은따옴표로 감싼) 문자열 리터럴이에요.

TBLPROPERTIES 절은 테이블 정의에 사용자 자신의 메타데이터 key/value 쌍을 태그할 수 있게 해줘요. Hive가 자동으로 추가·관리하는 last_modified_user, last_modified_time 같은 사전 정의 테이블 속성도 있습니다. 다른 사전 정의 속성들:

  • TBLPROPERTIES ("comment"="table_comment")
  • TBLPROPERTIES ("hbase.table.name"="table_name") – HBase Integration 참고
  • TBLPROPERTIES ("immutable"="true") 또는 ("immutable"="false") (0.13.0+, HIVE-6406)
  • TBLPROPERTIES ("orc.compress"="ZLIB")/("orc.compress"="SNAPPY")/("orc.compress"="NONE") 등 ORC 속성
  • TBLPROPERTIES ("transactional"="true") 또는 ("false") (0.14.0+, 기본 false) – Hive Transactions 참고
  • TBLPROPERTIES ("NO_AUTO_COMPACTION"="true"/"false"), 기본 false
  • TBLPROPERTIES ("compactor.mapreduce.map.memory.mb"="mapper_memory")
  • TBLPROPERTIES ("compactorthreshold.hive.compactor.delta.num.threshold"="threshold_num")
  • TBLPROPERTIES ("compactorthreshold.hive.compactor.delta.pct.threshold"="threshold_pct")
  • TBLPROPERTIES ("auto.purge"="true"/"false") (1.2.0+, HIVE-9118)
  • TBLPROPERTIES ("EXTERNAL"="TRUE") (0.6.0+, HIVE-1329) – 관리형 테이블을 외부 테이블로, 그 반대로 변경("FALSE")
  • Hive 2.4.0(부터 HIVE-16324)부터 'EXTERNAL' 속성 값은 대소문자 구분 없는 boolean으로 파싱됩니다.
  • TBLPROPERTIES ("external.table.purge"="true") (4.0.0+, HIVE-19981) – 외부 테이블에 설정하면 데이터도 함께 삭제됨

테이블의 데이터베이스를 지정하려면 CREATE TABLE 전에 USE database_name을 실행하거나(0.6+) 테이블 이름을 데이터베이스 이름으로 자격 부여("database_name.table.name", 0.7+)하면 돼요. 기본 데이터베이스에는 "default" 키워드를 쓸 수 있습니다.

Managed and External Tables

기본적으로 Hive는 관리형(managed) 테이블을 만들어, 파일·메타데이터·통계를 내부 Hive 프로세스가 관리합니다. 관리형과 외부 테이블의 차이는 Managed vs. External Tables 문서를 참고하세요.

Storage Formats

Hive는 내장 및 커스텀 개발 파일 형식을 지원해요. 압축 테이블 저장 정보는 CompressedStorage를 참고하세요. Hive에 내장된 형식 중 일부:

Storage Format Description
STORED AS TEXTFILE 일반 텍스트 파일로 저장. hive.default.fileformat이 다르게 설정되지 않았다면 TEXTFILE이 기본 파일 형식. 구분 기호(delimited) 파일을 읽으려면 DELIMITED 절 사용. ESCAPED BY 절로 구분 문자 이스케이프 활성화. NULL DEFINED AS 절로 커스텀 NULL 형식 지정(기본 \N). (Hive 4.0) 테이블의 모든 BINARY 컬럼은 base64 인코딩으로 가정. 원시 bytes로 읽으려면: TBLPROPERTIES ("hive.serialization.decode.binary.as.base64"="false")
STORED AS SEQUENCEFILE 압축된 Sequence File로 저장
STORED AS ORC ORC 파일 형식으로 저장. ACID 트랜잭션과 비용 기반 최적화기(CBO) 지원. 컬럼 수준 메타데이터 저장
STORED AS PARQUET Hive 0.13.0 이상에서 Parquet 컬럼형 저장 형식. Hive 0.10/0.11/0.12에서는 ROW FORMAT SERDE ... STORED AS INPUTFORMAT ... OUTPUTFORMAT 문법 사용
STORED AS AVRO Hive 0.14.0 이상에서 Avro 형식으로 저장 (Avro SerDe 참고)
STORED AS RCFILE Record Columnar File 형식으로 저장
STORED AS JSONFILE Hive 4.0.0 이상에서 Json 파일 형식으로 저장
STORED BY 비네이티브 테이블 형식으로 저장. HBase나 Druid, Accumulo로 뒷받침되는 비네이티브 테이블을 만들거나 연결할 때 사용. StorageHandlers 참고
INPUTFORMAT and OUTPUTFORMAT file_format에서 대응하는 InputFormat/OutputFormat 클래스 이름을 문자열 리터럴로 지정. 예: 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'. LZO 압축은 'INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat" OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat"' (LZO Compression 참고)

Row Formats & SerDe

커스텀 SerDe 또는 네이티브 SerDe로 테이블을 만들 수 있어요. ROW FORMAT을 지정하지 않거나 ROW FORMAT DELIMITED를 지정하면 네이티브 SerDe를 사용합니다. SERDE 절로 커스텀 SerDe 테이블을 만들어요. SerDe 관련 문서: Hive SerDe, SerDe, HCatalog Storage Formats.

네이티브 SerDe를 쓰는 테이블에 대해 컬럼 목록을 지정해야 해요. 커스텀 SerDe 테이블의 컬럼 목록은 지정할 수 있지만, Hive가 실제 컬럼 목록을 결정하기 위해 SerDe에 물어봅니다.

테이블의 SerDe나 SERDEPROPERTIES를 바꾸려면 ALTER TABLE 문을 사용하세요 (Add SerDe Properties 참고).

Row Format Description
RegEx ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ("input.regex" = "<regex>") STORED AS TEXTFILE; 정규식으로 변환되는 일반 텍스트 파일로 저장. 다음 예는 기본 Apache Weblog 형식의 테이블 정의: CREATE TABLE apachelog (host STRING, identity STRING, user STRING, time STRING, request STRING, status STRING, size STRING, referer STRING, agent STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ("input.regex" = "...")
JSON ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS TEXTFILE JSON 형식의 일반 텍스트 파일로 저장. JSON용 JsonSerDe는 Hive 0.12 이상에서 사용 가능. 일부 배포본에서는 hive-hcatalog-core.jar 참조 필요: ADD JAR /usr/lib/hive-hcatalog/lib/hive-hcatalog-core.jar; CREATE TABLE my_table(a string, b bigint, ...) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS TEXTFILE; Hive 3.0.0부터 JsonSerDe는 "org.apache.hadoop.hive.serde2.JsonSerDe"로 Hive Serde에 추가됨(HIVE-19211). STORED AS JSONFILE은 Hive 4.0.0부터 지원(HIVE-19899): CREATE TABLE my_table(a string, b bigint, ...) STORED AS JSONFILE;
CSV/TSV ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' STORED AS TEXTFILE CSV/TSV 형식의 일반 텍스트 파일로 저장. CSVSerde는 Hive 0.14 이상에서 사용 가능. TSV 예: CREATE TABLE my_table(a string, b string, ...) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ("separatorChar"="\t","quoteChar"="'","escapeChar"="\\") STORED AS TEXTFILE; 기본 속성은 CSV(DEFAULT_SEPARATOR=,). 대부분의 CSV 데이터에서 동작하지만 내장 개행은 처리하지 못함. 이 SerDe는 모든 컬럼을 String 타입으로 취급. DESCRIBE TABLE 출력도 string으로 나옴. 원하는 타입으로 변환하려면 CAST를 하는 뷰를 만들면 됨. Open-CSV 2.3 기반 (HIVE-7777)

Partitioned Tables

PARTITIONED BY 절로 파티셔닝된 테이블을 만들 수 있어요. 테이블은 하나 이상의 파티션 컬럼을 가질 수 있고, 파티션 컬럼의 고유한 값 조합마다 별도 데이터 디렉터리가 만들어집니다. 또한 CLUSTERED BY 컬럼으로 테이블/파티션을 버킷화할 수 있고, SORT BY 컬럼으로 버킷 안의 데이터를 정렬할 수 있어요. 이는 특정 종류의 쿼리 성능을 향상시킵니다.

파티셔닝된 테이블을 만들 때 "FAILED: Error in semantic analysis: Column repeated in partitioning columns" 오류가 나면, 파티션 컬럼을 테이블 데이터에 포함시키려는 경우예요. 파티션은 쿼리할 수 있는 유사 컬럼(pseudocolumn)을 만들므로 테이블 컬럼은 다른 이름으로 바꿔야 합니다.

예를 들어 원래 비파티션 테이블이 id, date, name 세 컬럼을 가졌다고 해 볼게요:

id     int,
date   date,
name   varchar

date로 파티셔닝하고 싶다면, "date"를 파티셔닝(및 쿼리)에 쓰기 위해 컬럼 이름을 "dtDontQuery"로 쓸 수 있어요:

create table table_name (
  id                int,
  dtDontQuery       string,
  name              string
)
partitioned by (date string)

사용자는 여전히 "where date = '...'"로 쿼리하지만, 두 번째 컬럼 dtDontQuery가 원래 값을 보관합니다.

파티셔닝된 테이블 생성 예:

CREATE TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(dt STRING, country STRING)
 STORED AS SEQUENCEFILE;

위 문장은 viewTime, userid, page_url, referrer_url, ip 컬럼(코멘트 포함)을 가진 page_view 테이블을 만들어요. 테이블은 파티셔닝되고 데이터는 시퀀스 파일로 저장됩니다. 파일의 데이터 형식은 ctrl-A로 필드 구분, 개행으로 행 구분으로 가정합니다.

CREATE TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(dt STRING, country STRING)
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\001'
STORED AS SEQUENCEFILE;

위 문장은 이전 테이블과 같은 테이블을 만들게 해 줍니다. 이전 예에서 데이터는 <hive.metastore.warehouse.dir>/page_view에 저장돼요. Hive 구성 파일 hive-site.xml에서 hive.metastore.warehouse.dir 키 값을 지정하세요.

External Tables

EXTERNAL 키워드는 LOCATION을 제공해 Hive가 이 테이블의 기본 위치를 쓰지 않게 합니다. 이미 생성된 데이터가 있을 때 유용해요. EXTERNAL 테이블을 drop해도 테이블의 데이터는 파일시스템에서 삭제되지 않습니다. Hive 4.0.0(HIVE-19981)부터 테이블 속성 external.table.purge=true를 설정하면 drop 시 데이터도 삭제됩니다. HiveStrictManagedMigration 유틸리티로 외부 테이블로 변환된 관리형 테이블은 drop 시 데이터가 삭제되도록 설정해야 합니다.

EXTERNAL 테이블은 hive.metastore.warehouse.dir 구성 속성이 지정한 폴더가 아닌 어떤 HDFS 위치를 가리켜요.

CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User',
     country STRING COMMENT 'country of origination')
 COMMENT 'This is the staging page view table'
 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'
 STORED AS TEXTFILE
 LOCATION '<hdfs_location>';

위 문장으로 어떤 HDFS 위치를 가리키는 page_view 테이블을 만들 수 있어요. 단 데이터가 CREATE 문에 지정한 대로 구분되어 있어야 합니다.

Create Table As Select (CTAS)

SQL 결과로 테이블을 만들고 채우는 걸 한 번에 하는 create-table-as-select(CTAS) 문도 가능해요. CTAS로 만든 테이블은 원자적입니다. 즉 모든 쿼리 결과가 채워질 때까지 다른 사용자가 테이블을 보지 못해요. 다른 사용자는 쿼리 완전한 결과를 가진 테이블을 보거나, 전혀 보지 못합니다.

CTAS에는 두 부분이 있어요. SELECT 부분은 HiveQL이 지원하는 어떤 SELECT 문이든 될 수 있습니다. CTAS의 CREATE 부분은 SELECT 부분에서 결과 스키마를 가져와 SerDe와 저장 형식 같은 다른 테이블 속성과 함께 대상 테이블을 만듭니다.

Hive 3.2.0부터 CTAS 문은 대상 테이블의 파티셔닝 사양을 정의할 수 있어요 (HIVE-20241).

CTAS의 제약:

  • 대상 테이블은 외부 테이블이 될 수 없어요.
  • 대상 테이블은 리스트 버킷 테이블이 될 수 없어요.
CREATE TABLE new_key_value_store
   ROW FORMAT SERDE "org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe"
   STORED AS RCFile
   AS
SELECT (key % 1024) new_key, concat(key, value) key_value_pair
FROM key_value_store
SORT BY new_key, key_value_pair;

위 CTAS 문은 SELECT 결과에서 파생된 스키마(new_key DOUBLE, key_value_pair STRING)를 가진 대상 테이블 new_key_value_store를 만들어요. SELECT 문이 컬럼 별칭을 지정하지 않으면 컬럼 이름이 자동으로 _col0, _col1, _col2 등으로 지정됩니다. 또 새 대상 테이블은 SELECT 문의 소스 테이블과 독립적인 특정 SerDe와 저장 형식으로 만들어집니다.

Hive 0.13.0부터 SELECT 문은 하나 이상의 공통 테이블 식(CTE)을 포함할 수 있어요.

한 테이블에서 다른 테이블로 데이터를 선택하는 것은 Hive의 가장 강력한 기능 중 하나예요. Hive는 쿼리가 실행되는 동안 소스 형식에서 대상 형식으로 데이터 변환을 처리합니다.

Create Table Like

CREATE TABLE의 LIKE 형식은 기존 테이블 정의를 데이터 복사 없이 정확히 복사할 수 있게 해 줍니다. CTAS와 달리 아래 문은 테이블 이름 외에 모든 면에서 기존 key_value_store와 정확히 일치하는 새 empty_key_value_store 테이블을 만들어요. 새 테이블은 행이 없습니다.

CREATE TABLE empty_key_value_store
LIKE key_value_store [TBLPROPERTIES (property_name=property_value, ...)];

Hive 0.8.0 이전에는 CREATE TABLE LIKE view_name이 뷰의 복사본을 만들었어요. Hive 0.8.0 이후 릴리스에서는 SerDe와 파일 형식에 기본값을 사용해 view_name의 스키마(필드·파티션 컬럼)를 채택한 테이블을 만듭니다.

Bucketed Sorted Tables

CREATE TABLE page_view(viewTime INT, userid BIGINT,
     page_url STRING, referrer_url STRING,
     ip STRING COMMENT 'IP Address of the User')
 COMMENT 'This is the page view table'
 PARTITIONED BY(dt STRING, country STRING)
 CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
 ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\001'
   COLLECTION ITEMS TERMINATED BY '\002'
   MAP KEYS TERMINATED BY '\003'
 STORED AS SEQUENCEFILE;

위 예에서 page_view 테이블은 userid로 버킷화되고(clustered by) 각 버킷 안에서 데이터는 viewTime 오름차순으로 정렬됩니다. 이런 구성은 클러스터된 컬럼(userid)에 대한 효율적인 샘플링을 가능하게 해 줍니다. 정렬 속성은 내부 연산자가 쿼리 평가 시 더 잘 알려진 데이터 구조를 활용할 수 있게 해 효율도 높여요. 컬럼이 리스트나 맵이면 MAP KEYS와 COLLECTION ITEMS 키워드를 쓸 수 있어요.

CLUSTERED BY와 SORTED BY 생성 명령은 데이터가 테이블에 삽입되는 방식에는 영향을 주지 않고 읽는 방식만 영향을 줘요. 즉 사용자는 리듀서 수를 버킷 수와 같게 지정하고 쿼리에서 CLUSTER BY와 SORT BY 명령을 써서 데이터를 올바르게 삽입해야 합니다.

Skewed Tables

버전 정보: Hive 0.10.0(HIVE-3072, HIVE-3649)부터.

이 기능은 하나 이상의 컬럼이 왜곡(skewed)된 값을 가진 테이블의 성능을 개선하는 데 쓰여요. 아주 자주 나타나는 값(중요한 왜곡)을 지정하면 Hive가 이들을 별도 파일(리스트 버킷의 경우 디렉터리)로 자동 분리하고, 쿼리 중 그 사실을 고려해 가능하면 전체 파일(또는 디렉터리)을 건너뛰거나 포함할 수 있어요.

이건 테이블 생성 시 테이블별로 지정할 수 있습니다.

다음 예는 세 개의 왜곡 값이 있는 한 컬럼을 보여주며, 선택적으로 리스트 버킷을 지정하는 STORED AS DIRECTORIES 절을 포함합니다.

CREATE TABLE list_bucket_single (key STRING, value STRING)
  SKEWED BY (key) ON (1,5,6) [STORED AS DIRECTORIES];

왜곡된 두 컬럼이 있는 테이블 예:

CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING)
  SKEWED BY (col1, col2) ON (('s1',1), ('s3',3), ('s13',13), ('s78',78)) [STORED AS DIRECTORIES];

Temporary Tables

버전 정보: Hive 0.14.0(HIVE-7090)부터.

임시 테이블로 생성된 테이블은 현재 세션에서만 보여요. 데이터는 사용자의 스크래치 디렉터리에 저장되고 세션이 끝나면 삭제됩니다.

임시 테이블을 데이터베이스에 이미 존재하는 영구 테이블의 데이터베이스/테이블 이름으로 만들면, 그 세션 안에서 그 이름에 대한 모든 참조는 영구 테이블이 아니라 임시 테이블로 해석됩니다. 사용자는 임시 테이블을 drop하거나 충돌하지 않는 이름으로 바꾸지 않는 한 그 세션에서 원래 테이블에 접근할 수 없어요.

임시 테이블의 한계:

  • 파티션 컬럼 지원 안 됨.
  • 인덱스 생성 지원 안 됨.

Hive 1.1.0부터 hive.exec.temporary.table.storage 구성 파라미터로 임시 테이블의 저장 정책을 memory, ssd, default로 설정할 수 있어요.

CREATE TEMPORARY TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING);

Transactional Tables

버전 정보: Hive 4.0(HIVE-18453)부터.

ACID 의미론으로 동작을 지원하는 테이블이에요. 트랜잭션 테이블에 대한 자세한 내용은 관련 문서를 참고하세요.

CREATE TRANSACTIONAL TABLE transactional_table_test(key string, value string) PARTITIONED BY(ds string) STORED AS ORC;

Constraints

버전 정보: Hive 2.1.0(HIVE-13290)부터.

Hive는 검증되지 않은(non-validated) 기본 키와 외래 키 제약을 지원해요. 일부 SQL 도구는 제약이 있을 때 더 효율적인 쿼리를 생성합니다. 이 제약들은 검증되지 않으므로, 상류 시스템이 Hive에 적재되기 전에 데이터 무결성을 보장해야 해요.

create table pk(id1 integer, id2 integer,
  primary key(id1, id2) disable novalidate);

create table fk(id1 integer, id2 integer,
  constraint c1 foreign key(id1, id2) references pk(id2, id1) disable novalidate);

버전 정보: Hive 3.0.0(HIVE-16575, HIVE-18726, HIVE-18953)부터.

Hive는 UNIQUE, NOT NULL, DEFAULT, CHECK 제약을 지원해요. UNIQUE를 제외한 세 유형은 강제(enforce)됩니다.

create table constraints1(id1 integer UNIQUE disable novalidate, id2 integer NOT NULL, 
  usr string DEFAULT current_user(), price double CHECK (price > 0 AND price <= 1000));

create table constraints2(id1 integer, id2 integer,
  constraint c1_unique UNIQUE(id1) disable novalidate);

create table constraints3(id1 integer, id2 integer,
  constraint c1_check CHECK(id1 + id2 > 0));

map, struct, array 같은 복합 데이터 타입에는 DEFAULT가 지원되지 않아요.

Drop Table

DROP TABLE [IF EXISTS] table_name [PURGE];     -- (Note: PURGE available in Hive 0.14.0 and later)

DROP TABLE은 이 테이블의 메타데이터와 데이터를 제거해요. Trash가 구성되어 있고(PURGE가 지정되지 않았다면) 데이터는 실제로 .Trash/Current 디렉터리로 이동합니다. 메타데이터는 완전히 손실됩니다.

EXTERNAL 테이블을 drop하면 테이블의 데이터는 파일시스템에서 삭제되지 않습니다. Hive 4.0.0(HIVE-19981)부터 테이블 속성 external.table.purge=true를 설정하면 데이터도 삭제됩니다.

뷰가 참조하는 테이블을 drop할 때는 경고가 없어요 (뷰는 유효하지 않은 상태로 매달려 사용자가 drop하거나 다시 만들어야 함).

그 외에는 테이블 정보가 metastore에서 제거되고 원시 데이터가 'hadoop dfs -rm'처럼 제거됩니다. 많은 경우 테이블 데이터가 사용자 홈 디렉터리의 .Trash 폴더로 이동되므로, 실수로 DROP TABLE한 사용자는 같은 스키마로 테이블을 다시 만들고 필요한 파티션을 재생성한 뒤 Hadoop으로 데이터를 다시 제자리에 옮겨 복구할 수 있습니다.

PURGE 버전 정보: PURGE 옵션은 0.14.0에 HIVE-7100으로 추가됐어요. PURGE가 지정되면 테이블 데이터가 .Trash/Current로 가지 않아 실수로 DROP해도 복구할 수 없습니다. purge 옵션은 테이블 속성 auto.purge로도 지정 가능해요.

Hive 0.7.0 이상에서, 테이블이 없으면 DROP은 IF EXISTS가 지정되거나 hive.exec.drop.ignorenonexistent가 true로 설정되지 않으면 오류를 반환합니다.

Truncate Table

버전 정보: Hive 0.11.0(HIVE-446)부터.

TRUNCATE [TABLE] table_name [PARTITION partition_spec];

partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

테이블이나 파티션(들)의 모든 행을 제거해요. 파일시스템 Trash가 활성화되어 있으면 행이 휴지통으로 가고, 아니면 삭제됩니다 (Hive 2.2.0, HIVE-14626). 현재 대상 테이블은 네이티브/관리형 테이블이어야 하며 아니면 예외가 발생합니다. 부분 partition_spec을 지정해 여러 파티션을 한 번에 잘라낼 수 있고, partition_spec을 생략하면 테이블의 모든 파티션을 잘라냅니다.

Hive 2.3.0(HIVE-15880)부터 테이블 속성 "auto.purge"가 "true"면 TRUNCATE TABLE 명령을 내려도 데이터가 Trash로 이동하지 않고 실수로 TRUNCATE해도 복구할 수 없어요. 관리형 테이블에만 해당합니다.

Hive 4.0(HIVE-23183)부터 TABLE 토큰은 선택 사항이고, 이전 버전에서는 필수였어요.

Alter Table/Partition/Column

하위 섹션: Rename Table, Alter Table Properties, Alter Table Comment, Add SerDe Properties, Remove SerDe Properties, Alter Table Storage Properties, Alter Table Skewed or Stored as Directories, Alter Table Constraints, Alter Partition(Add/Dynamic/Rename/Exchange/Discover/Retention/Recover/Drop/(Un)Archive), Alter Either Table or Partition(File Format/Location/Touch/Protections/Compact/Concatenate/Update columns), Alter Column(Change Column, Add/Replace Columns), Partial Partition Specification.

alter table 문은 기존 테이블의 구조를 변경할 수 있게 해 줍니다. 컬럼/파티션 추가, SerDe 변경, 테이블·SerDe 속성 추가, 테이블 이름 변경 등을 할 수 있어요. 마찬가지로 alter table partition 문은 명명된 테이블의 특정 파티션 속성을 변경하게 해 줍니다.

Rename Table

ALTER TABLE table_name RENAME TO new_table_name;

이 문은 테이블 이름을 다른 이름으로 바꿉니다. 0.6 버전부터 관리형 테이블의 이름 변경은 HDFS 위치를 옮겨요. Hive 2.2.0(HIVE-14909)부터는 LOCATION 절 없이 데이터베이스 디렉터리 아래 만들어진 테이블일 때만 HDFS 위치를 옮깁니다.

Alter Table Properties

ALTER TABLE table_name SET TBLPROPERTIES table_properties;

table_properties:
  : (property_name = property_value, property_name = property_value, ... )

이 문으로 테이블에 자신의 메타데이터를 추가할 수 있어요. currently last_modified_user, last_modified_time 속성은 Hive가 자동으로 추가·관리합니다. DESCRIBE EXTENDED TABLE로 이 정보를 얻을 수 있어요.

Alter Table Comment

테이블의 코멘트를 바꾸려면 TBLPROPERTIEScomment 속성을 바꿔야 합니다:

ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);

Add SerDe Properties

ALTER TABLE table_name [PARTITION partition_spec] SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties];

ALTER TABLE table_name [PARTITION partition_spec] SET SERDEPROPERTIES serde_properties;

serde_properties:
  : (property_name = property_value, property_name = property_value, ... )

이 문들은 테이블의 SerDe를 바꾸거나 테이블의 SerDe 객체에 사용자 정의 메타데이터를 추가할 수 있게 해 줍니다.

SerDe 속성은 Hive가 데이터를 직렬화/역직렬화하기 위해 SerDe를 초기화할 때 테이블의 SerDe로 전달됩니다. property_nameproperty_value 모두 따옴표로 감싸야 해요.

ALTER TABLE table_name SET SERDEPROPERTIES ('field.delim' = ',');

Remove SerDe Properties

버전 정보: Remove SerDe Properties는 Hive 4.0.0(HIVE-21952)부터 지원.

ALTER TABLE table_name [PARTITION partition_spec] UNSET SERDEPROPERTIES (property_name, ... );

다음 문으로 테이블의 SerDe 객체에서 사용자 정의 메타데이터를 제거할 수 있어요. property_name은 따옴표로 감싸야 합니다.

ALTER TABLE table_name UNSET SERDEPROPERTIES ('field.delim');

Alter Table Storage Properties

ALTER TABLE table_name CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name, ...)]
  INTO num_buckets BUCKETS;

이 문들은 테이블의 물리적 저장 속성을 변경해요. 주의: 이 명령은 Hive의 메타데이터만 수정하고 기존 데이터를 재구성하거나 재포맷하지 않습니다. 실제 데이터 레이아웃이 메타데이터 정의와 일치하는지 사용자가 확인해야 합니다.

Alter Table Skewed / Not Skewed / Not Stored as Directories / Set Skewed Location

테이블의 SKEWED와 STORED AS DIRECTORIES 옵션은 ALTER TABLE 문으로 변경할 수 있어요 (Hive 0.10.0+).

ALTER TABLE table_name SKEWED BY (col_name1, col_name2, ...)
  ON ([(col_name1_value, col_name2_value, ...) [, (col_name1_value, col_name2_value), ...]
  [STORED AS DIRECTORIES];

STORED AS DIRECTORIES 옵션은 왜곡 테이블이 왜곡 값의 하위 디렉터리를 만드는 리스트 버킷 기능을 사용할지 결정해요.

ALTER TABLE table_name NOT SKEWED;

NOT SKEWED 옵션은 테이블을 non-skewed로 만들고 리스트 버킷 기능을 끕니다 (리스트 버킷 테이블은 항상 skewed이기 때문). 이는 ALTER 문 이후에 생성된 파티션에 영향을 주지만, 이전에 생성된 파티션에는 효과가 없습니다.

ALTER TABLE table_name NOT STORED AS DIRECTORIES;

이건 테이블이 skewed로 남아 있어도 리스트 버킷 기능을 끕니다.

ALTER TABLE table_name SET SKEWED LOCATION (col_name1="location1" [, col_name2="location2", ...] );

이건 리스트 버킷의 위치 맵을 변경해요.

Alter Table Constraints

버전 정보: Hive 2.1.0부터. 테이블 제약은 ALTER TABLE 문으로 추가하거나 제거할 수 있어요.

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (column, ...) DISABLE NOVALIDATE;
ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column, ...) REFERENCES table_name(column, ...) DISABLE NOVALIDATE RELY;
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (column, ...) DISABLE NOVALIDATE;
ALTER TABLE table_name CHANGE COLUMN column_name column_name data_type CONSTRAINT constraint_name NOT NULL ENABLE;
ALTER TABLE table_name CHANGE COLUMN column_name column_name data_type CONSTRAINT constraint_name DEFAULT default_value ENABLE;
ALTER TABLE table_name CHANGE COLUMN column_name column_name data_type CONSTRAINT constraint_name CHECK check_expression ENABLE;

ALTER TABLE table_name DROP CONSTRAINT constraint_name;

Alter Partition

파티션은 ALTER TABLE 문의 PARTITION 절로 추가, 이름 변경, 교환(이동), 삭제(drop), (un)archive할 수 있어요. HDFS에 직접 추가된 파티션을 metastore가 알게 하려면 metastore 검사 명령(MSCK)을 쓰거나, Amazon EMR에서는 ALTER TABLE의 RECOVER PARTITIONS 옵션을 쓸 수 있습니다.

버전 1.2+: Hive 1.2(HIVE-10307)부터 partition_spec의 파티션 값은 hive.typecheck.on.insert가 true(기본)일 때 컬럼 타입에 맞게 타입 검사·변환·정규화됩니다. 값은 숫자 리터럴일 수 있습니다.

Add Partitions
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];

partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

ALTER TABLE ADD PARTITION으로 테이블에 파티션을 추가할 수 있어요. 파티션 값은 문자열일 때만 따옴표를 붙여야 합니다. location은 데이터 파일이 존재하는 디렉터리여야 해요. (ADD PARTITION은 테이블 메타데이터를 바꾸지만 데이터를 적재하지는 않습니다. 파티션 위치에 데이터가 없으면 쿼리는 결과를 반환하지 않아요.) 테이블의 partition_spec이 이미 있으면 오류가 발생합니다. IF NOT EXISTS로 건너뛸 수 있어요.

Hive 0.8 이상에서는 이전 예처럼 단일 ALTER TABLE 문에서 여러 파티션을 추가할 수 있습니다. (0.7에는 버그가 있었음.)

Rename Partition

버전 정보: Hive 0.9부터.

ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;

이 문으로 파티션 컬럼의 값을 변경할 수 있어요. 한 가지 용도는 레거시 파티션 컬럼 값을 해당 타입에 맞게 정규화하는 것입니다.

Exchange Partition

파티션은 테이블 사이에서 교환(이동)할 수 있어요. 버전 정보: Hive 0.12(HIVE-4095)부터; 여러 파티션은 1.2.2, 1.3.0, 2.0.0+에서 지원.

-- Move partition from table_name_1 to table_name_2
ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_1;
-- multiple partitions
ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec, partition_spec2, ...) WITH TABLE table_name_1;

이 문은 한 테이블의 파티션 데이터를, 스키마가 같고 그 파티션이 없는 다른 테이블로 이동시켜요. 자세한 내용은 Exchange Partition과 HIVE-4095 참고.

Discover Partitions

테이블 속성 "discover.partitions"를 지정해 Hive Metastore의 파티션 메타데이터 자동 발견·동기화를 제어할 수 있어요. HMS(Hive Metastore Service)가 원격 서비스 모드로 시작되면 백그라운드 스레드(PartitionManagementTask)가 매 300초마다(metastore.partition.management.task.frequency로 설정 가능) "discover.partitions" 속성이 true인 테이블을 찾아 sync 모드로 MSCK REPAIR를 수행합니다. 트랜잭션 테이블이면 MSCK REPAIR 전에 Exclusive Lock을 얻어요. 이 속성으로 "MSCK REPAIR TABLE table_name SYNC PARTITIONS"를 수동으로 실행할 필요가 없어집니다.

버전 정보: Hive 4.0.0(HIVE-20707)부터.

Partition Retention

테이블 속성 "partition.retention.period"를 파티셔닝된 테이블에 보존 기간과 함께 지정할 수 있어요. 보존 기간이 지정되면 HMS에서 도는 백그라운드 스레드가 파티션의 나이(생성 시간)를 확인하고, 파티션 나이가 보존 기간보다 오래되면 drop합니다. 보존 기간 후 파티션을 drop하면 그 파티션의 데이터도 삭제돼요. 예를 들어 'date' 파티션의 외부 파티셔닝 테이블에 "discover.partitions"="true"와 "partition.retention.period"="7d"를 지정하면 지난 7일 동안 생성된 파티션만 유지됩니다.

버전 정보: Hive 4.0.0(HIVE-20707)부터.

Recover Partitions (MSCK REPAIR TABLE)

Hive는 각 테이블의 파티션 목록을 metastore에 저장해요. 하지만 hadoop fs -put 같은 명령으로 새 파티션이 HDFS에 직접 추가되거나 HDFS에서 제거되면, 사용자가 각 파티션에 대해 ALTER TABLE ... ADD/DROP PARTITION을 실행하지 않는 한 metastore(Hive)는 파티션 정보의 변화를 알지 못합니다.

사용자는 repair table 옵션으로 metastore 검사 명령을 실행할 수 있어요:

MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];

이 명령은 아직 metastore에 메타데이터가 없는 파티션들의 메타데이터를 갱신해요. MSC 명령의 기본 옵션은 ADD PARTITIONS입니다. 이 옵션으로 HDFS에는 있지만 metastore에 없는 파티션을 metastore에 추가해요. DROP PARTITIONS 옵션은 이미 HDFS에서 제거된 파티션 정보를 metastore에서 제거합니다. SYNC PARTITIONS는 ADD와 DROP 둘 다 수행하는 것과 같습니다. 추적되지 않는 파티션이 많으면 OOME(Out of Memory Error)을 피하기 위해 MSCK REPAIR TABLE을 배치로 실행할 수 있어요. hive.msck.repair.batch.size 속성으로 배치 크기를 주면 내부적으로 배치로 실행됩니다. 기본값 0은 모든 파티션을 한 번에 실행한다는 뜻이에요. REPAIR 옵션 없는 MSCK는 metastore의 메타데이터 불일치에 대한 상세 정보를 찾는 데 쓸 수 있습니다.

Amazon EMR 버전의 Hive에서 동등한 명령:

ALTER TABLE table_name RECOVER PARTITIONS;

Hive 1.3부터 MSCK는 HDFS에서 파티션 값에 허용되지 않는 문자가 있는 디렉터리를 발견하면 예외를 던져요. hive.msck.path.validation 설정으로 동작을 바꿀 수 있는데, "skip"은 디렉터리를 그냥 건너뛰고, "ignore"는 어쨌든 파티션을 만들려 시도합니다 (옛 동작).

Drop Partitions
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...]
  [IGNORE PROTECTION] [PURGE];            -- (Note: PURGE available in Hive 1.2.0 and later, IGNORE PROTECTION not available 2.0.0 and later)

ALTER TABLE DROP PARTITION으로 테이블의 파티션을 없앨 수 있어요. 이는 이 파티션의 데이터와 메타데이터를 제거합니다. 데이터는 PURGE가 지정되지 않는 한 Trash가 구성되어 있으면 .Trash/Current로 이동하지만, 메타데이터는 완전히 손실됩니다.

PROTECTION 버전 정보: IGNORE PROTECTION은 2.0.0 이상에서 더 이상 사용할 수 없어요. 이 기능은 Hive의 여러 보안 옵션 중 하나를 사용하는 것으로 대체됐습니다.

NO_DROP CASCADE로 보호되는 테이블의 경우 IGNORE PROTECTION 프레디킷으로 지정된 파티션(들)을 drop할 수 있어요 (예: 두 Hadoop 클러스터 사이에서 테이블을 나눌 때):

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec IGNORE PROTECTION;

PURGE 버전 정보: PURGE 옵션은 1.2.1에 HIVE-10934로 ALTER TABLE에 추가됐어요. PURGE가 지정되면 파티션 데이터가 .Trash/Current로 가지 않아 실수로 DROP해도 복구할 수 없습니다:

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec PURGE;     -- (Note: Hive 1.2.0 and later)

purge 옵션은 테이블 속성 auto.purge로도 지정할 수 있어요.

Hive 0.7.0 이상에서 파티션이 없으면 DROP은 IF EXISTS가 지정되거나 hive.exec.drop.ignorenonexistent가 true가 아니면 오류를 반환합니다.

ALTER TABLE page_view DROP PARTITION (dt='2008-08-08', country='us');
(Un)Archive Partition
ALTER TABLE table_name ARCHIVE PARTITION partition_spec;
ALTER TABLE table_name UNARCHIVE PARTITION partition_spec;

Archiving은 파티션의 파일을 Hadoop Archive(HAR)로 옮기는 기능이에요. 파일 수만 줄어들고 HAR은 압축을 제공하지 않습니다.

Alter Either Table or Partition

File Format
ALTER TABLE table_name [PARTITION partition_spec] SET FILEFORMAT file_format;

이 문은 테이블(또는 파티션)의 파일 형식을 바꿔요. 이 작업은 테이블 메타데이터만 바꾸고, 기존 데이터 변환은 Hive 밖에서 해야 합니다.

Location
ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location";
Touch
ALTER TABLE table_name TOUCH [PARTITION partition_spec];

TOUCH는 메타데이터를 읽고 다시 씁니다. 이는 pre/post execute 훅을 실행하게 하는 효과가 있어요. 예를 들어 수정된 모든 테이블/파티션을 로깅하는 훅이 있고, 외부 스크립트가 HDFS의 파일을 직접 변경하는 경우를 생각해 보세요. 스크립트가 hive 밖에서 파일을 수정하므로 변경이 훅에 로깅되지 않아요. 외부 스크립트가 TOUCH를 호출해 훅을 실행하고 해당 테이블/파티션을 수정된 것으로 표시할 수 있습니다. TOUCH는 존재하지 않는 테이블/파티션을 만들지 않습니다.

Protections

버전 정보: Hive 0.7.0(HIVE-1413)부터. NO_DROP용 CASCADE 절은 Hive 0.8.0(HIVE-2605)에 추가. 이 기능은 Hive 2.0.0에서 제거되었고 보안 옵션으로 대체됐습니다.

ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE NO_DROP [CASCADE];

ALTER TABLE table_name [PARTITION partition_spec] ENABLE|DISABLE OFFLINE;

데이터 보호는 테이블 또는 파티션 수준에서 설정할 수 있어요. NO_DROP을 활성화하면 테이블이 drop되지 않게 합니다. OFFLINE을 활성화하면 테이블/파티션의 데이터를 쿼리할 수 없지만 메타데이터는 접근할 수 있습니다. 테이블의 어떤 파티션이 NO_DROP을 활성화했으면 테이블도 drop할 수 없어요. 반대로 테이블이 NO_DROP을 활성화했으면 파티션은 drop될 수 있지만, NO_DROP CASCADE면 drop partition 명령에 IGNORE PROTECTION을 지정하지 않는 한 파티션도 drop할 수 없습니다.

Compact

버전 정보: Hive 0.13.0 이상에서 트랜잭션 사용 시 ALTER TABLE은 테이블/파티션의 컴팩션을 요청할 수 있어요. 컴팩션 풀링은 4.0.0-alpha-2부터, rebalance 컴팩션은 4.0.0부터 사용 가능.

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])]
  COMPACT 'compaction_type'[AND WAIT]
   [CLUSTERED INTO n BUCKETS]
   [ORDER BY col_list]
   [POOL 'pool_name']
   [WITH OVERWRITE TBLPROPERTIES ("property"="value" [, ...])];

일반적으로 Hive 트랜잭션을 사용할 때는 컴팩션을 직접 요청할 필요가 없어요. 시스템이 필요를 감지하고 컴팩션을 시작하기 때문입니다. 다만 테이블에 대해 컴팩션이 꺼져 있거나 시스템이 선택하지 않는 시점에 컴팩션하고 싶으면 ALTER TABLE로 컴팩션을 시작할 수 있어요. 기본적으로 이 문은 컴팩션 요청을 큐에 넣고 반환합니다. 진행 상황은 SHOW COMPACTIONS로 확인해요. Hive 2.2.0부터 "AND WAIT"를 지정하면 컴팩션이 완료될 때까지 작업을 블록할 수 있습니다.

compaction_type은 MAJOR, MINOR 또는 REBALANCE입니다. [CLUSTERED INTO n BUCKETS]와 [ORDER BY col_list] 절은 REBALANCE 컴팩션에서만 지원돼요.

Concatenate

버전 정보: Hive 0.8.0에서 RCFile이 concatenate 명령으로 작은 RCFile의 빠른 블록 수준 병합을 지원. Hive 0.14.0에서 ORC가 작은 ORC 파일의 빠른 스트라이프 수준 병합을 지원.

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] CONCATENATE;

테이블/파티션에 작은 RCFiles나 ORC 파일이 많으면 위 명령이 이들을 더 큰 파일로 병합합니다. RCFile의 경우 블록 수준, ORC의 경우 스트라이프 수준에서 병합이 일어나 데이터 압축 해제·디코딩 오버헤드를 피합니다.

Update columns

버전 정보: Hive 3.0.0에 추가. serde에 저장된 스키마 정보를 metastore에 동기화하게 해 줍니다.

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] UPDATE COLUMNS;

스키마를 스스로 기술하는 serde를 가진 테이블은 실제 스키마와 Hive Metastore에 저장된 스키마가 다를 수 있어요. 예를 들어 스키마 URL이나 리터럴로 Avro 저장 테이블을 만들면, 그 스키마는 HMS에 삽입된 뒤 serde 내부의 url/리터럴 변경과 무관하게 HMS에서 변하지 않습니다. 이는 특히 다른 Apache 컴포넌트와 통합할 때 문제가 될 수 있어요. update columns 기능은 serde의 스키마 변경을 HMS에 동기화시켜 줍니다. 테이블과 파티션 수준 모두에서 동작하며, 당연히 HMS가 스키마를 추적하지 않는 테이블에만 유효합니다.

Alter Column

Rules for Column Names

컬럼 이름은 대소문자를 구분하지 않아요. (0.12.0 이하에서는 영숫자·밑줄만 허용.) 0.13.0 이상에서는 백틱 안에서 모든 유니코드 문자를 사용할 수 있고(HIVE-6013), 점(.)과 콜론(:)은 쿼리 오류를 일으킵니다. hive.support.quoted.identifiersnone으로 설정하면 0.13.0 이전 동작을 쓸 수 있어요. 백틱 인용은 예약 키워드를 컬럼/테이블 이름으로 쓰게 해 줍니다.

Change Column Name/Type/Position/Comment
ALTER TABLE table_name [PARTITION partition_spec] CHANGE [COLUMN] col_old_name col_new_name column_type
  [COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];

이 명령으로 컬럼의 이름, 데이터 타입, 코멘트, 위치를 단독 또는 임의 조합으로 변경할 수 있어요. PARTITION 절은 Hive 0.14.0 이상에서 사용 가능. CASCADE|RESTRICT 절은 Hive 1.1.0에서 사용 가능. ALTER TABLE CHANGE COLUMN의 CASCADE 명령은 테이블 메타데이터의 컬럼을 바꾸고 같은 변경을 모든 파티션 메타데이터에 전파해요. RESTRICT가 기본이며 컬럼 변경을 테이블 메타데이터로만 제한합니다. CASCADE는 테이블/파티션의 보호 모드와 무관하게 파티션 컬럼 메타데이터를 덮어쓰므로 주의해서 쓰세요.

컬럼 변경 명령은 Hive 메타데이터만 수정하고 데이터는 수정하지 않아요.

CREATE TABLE test_change (a int, b int, c int);

// First change column a's name to a1.
ALTER TABLE test_change CHANGE a a1 INT;

// Next change column a1's name to a2, its data type to string, and put it after column b.
ALTER TABLE test_change CHANGE a1 a2 STRING AFTER b;
// The new table's structure is:  b int, a2 string, c int.

// Then change column c's name to c1, and put it as the first column.
ALTER TABLE test_change CHANGE c c1 INT FIRST;
// The new table's structure is:  c1 int, b int, a2 string.

// Add a comment to column a1
ALTER TABLE test_change CHANGE a1 a1 INT COMMENT 'this is column a1';
Add/Replace Columns
ALTER TABLE table_name 
  [PARTITION partition_spec]                 -- (Note: Hive 0.14.0 and later)
  ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
  [CASCADE|RESTRICT]                         -- (Note: Hive 1.1.0 and later)

ADD COLUMNS는 기존 컬럼 끝, 파티션 컬럼 앞에 새 컬럼을 추가하게 해 줍니다. Avro 기반 테이블에서도 지원돼요 (Hive 0.14 이상). REPLACE COLUMNS는 모든 기존 컬럼을 제거하고 새 컬럼 집합을 추가해요. 네이티브 SerDe(DynamicSerDe, MetadataTypedColumnsetSerDe, LazySimpleSerDe, ColumnarSerDe) 테이블에서만 할 수 있습니다. REPLACE COLUMNS는 컬럼 drop에도 쓸 수 있어요. 예를 들어 "ALTER TABLE test_change REPLACE COLUMNS (a int, b int);"는 test_change 스키마에서 컬럼 'c'를 제거합니다.

Partial Partition Specification

Hive 0.14(HIVE-8411)부터 위 alter column 문 중 일부에 동적 파티셔닝과 비슷하게 부분 파티션 스펙을 제공할 수 있어요. 매 파티션마다 alter column을 내리는 대신:

ALTER TABLE foo PARTITION (ds='2008-04-08', hr) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(38,18);

한 번에 많은 파티션을 바꿀 수 있습니다. hive.exec.dynamic.partition을 true로 설정해야 합니다. 이를 지원하는 작업: Change column, Add column, Replace column, File Format, Serde Properties.

Create/Drop/Alter View

버전 정보: 뷰 지원은 Hive 0.6 이상에서만 가능.

Create View

CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
  [COMMENT view_comment]
  [TBLPROPERTIES (property_name = property_value, ...)]
  AS SELECT ...;

CREATE VIEW는 주어진 이름의 뷰를 만들어요. 같은 이름의 테이블/뷰가 있으면 오류가 발생하고 IF NOT EXISTS로 건너뛸 수 있습니다. 컬럼 이름을 주지 않으면 정의 SELECT 식에서 자동으로 파생됩니다. (SELECT에 x+y 같은 별칭 없는 스칼라 식이 있으면 _C0, _C1 형식으로 생성됩니다.)

뷰는 순수 논리 객체로 저장소가 없어요. 쿼리가 뷰를 참조하면 쿼리가 추가 처리할 행 집합을 만들기 위해 뷰의 정의가 평가됩니다. (개념적 설명이며, 실제로는 쿼리 최적화의 일부로 Hive가 뷰 정의와 쿼리를 결합할 수 있어요.)

뷰의 스키마는 생성 시점에 고정됩니다. 이후 하부 테이블의 변경(예: 컬럼 추가)은 뷰 스키마에 반영되지 않아요. 하부 테이블이 drop되거나 호환되지 않게 바뀌면, 이후 유효하지 않은 뷰를 쿼리하려는 시도는 실패합니다. 뷰는 읽기 전용이며 LOAD/INSERT/ALTER의 대상이 될 수 없어요.

뷰는 ORDER BY와 LIMIT 절을 포함할 수 있어요. 참조 쿼리에도 이 절이 있으면 쿼리 수준 절은 뷰 절 이후에(그리고 쿼리의 다른 작업 후에) 평가됩니다. 예를 들어 뷰가 LIMIT 5를 지정하고 참조 쿼리가 (select * from v LIMIT 10)으로 실행되면 최대 5행이 반환돼요.

CREATE VIEW onion_referrers(url COMMENT 'URL of Referring page')
  COMMENT 'Referrers to The Onion website'
  AS
  SELECT DISTINCT referrer_url
  FROM page_view
  WHERE page_url='http://www.theonion.com';

SHOW CREATE TABLE로 뷰를 만든 CREATE VIEW 문을 표시할 수 있어요.

Drop View

DROP VIEW [IF EXISTS] [db_name.]view_name;

DROP VIEW는 지정된 뷰의 메타데이터를 제거해요. (뷰에 DROP TABLE을 쓰는 건 불법입니다.) 다른 뷰가 참조하는 뷰를 drop하면 경고가 없습니다.

DROP VIEW onion_referrers;

Alter View Properties

ALTER VIEW [db_name.]view_name SET TBLPROPERTIES table_properties;

table_properties:
  : (property_name = property_value, property_name = property_value, ...)

ALTER TABLE처럼 이 문으로 뷰에 자신의 메타데이터를 추가할 수 있어요.

Alter View As Select

버전 정보: Hive 0.11부터.

ALTER VIEW [db_name.]view_name AS select_statement;

Alter View As Select는 반드시 존재해야 하는 뷰의 정의를 변경해요. 문법은 CREATE VIEW와 비슷하고 CREATE OR REPLACE VIEW와 같은 효과입니다. 뷰에 파티션이 있으면 이 방식으로 대체할 수 없어요.

Create/Drop/Alter Materialized View

버전 정보: 구체화 뷰(materialized view) 지원은 Hive 3.0 이상에서만 가능.

Create Materialized View

CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]materialized_view_name
  [DISABLE REWRITE]
  [COMMENT materialized_view_comment]
  [PARTITIONED ON (col_name, ...)]
  [CLUSTERED ON (col_name, ...) | DISTRIBUTED ON (col_name, ...) SORTED ON (col_name, ...)]
  [
    [ROW FORMAT row_format]
    [STORED AS file_format]
      | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]
AS SELECT ...;

CREATE MATERIALIZED VIEW는 주어진 이름의 구체화 뷰를 만들어요. 같은 이름의 테이블/뷰/구체화 뷰가 있으면 오류가 발생합니다. 구체화 뷰의 컬럼 이름은 정의 SELECT 식에서 자동으로 파생됩니다. 기본적으로 구체화 뷰는 생성 시 쿼리 최적화기가 자동 재작성에 사용하도록 활성화됩니다.

버전 정보: PARTITIONED ON은 Hive 3.2.0(HIVE-14493)부터, CLUSTERED/DISTRIBUTED/SORTED ON은 Hive 4.0.0(HIVE-18842)부터 지원.

Drop Materialized View

DROP MATERIALIZED VIEW [db_name.]materialized_view_name;

DROP MATERIALIZED VIEW는 이 구체화 뷰의 메타데이터와 데이터를 제거해요.

Alter Materialized View

구체화 뷰가 생성되면 최적화기가 그 정의 의미론을 활용해 들어오는 쿼리를 구체화 뷰로 자동 재작성할 수 있어 쿼리 실행을 가속화해요. 사용자는 구체화 뷰를 재작성용으로 선택적으로 활성화/비활성화할 수 있습니다. 기본적으로 구체화 뷰는 생성 시 재작성이 활성화됩니다.

ALTER MATERIALIZED VIEW [db_name.]materialized_view_name ENABLE|DISABLE REWRITE;

Create/Drop/Alter Index

버전 정보: Hive 0.7부터. 인덱싱은 3.0부터 제거됐습니다! Indexes design document 참고.

Hive 0.12.0 이하에서 CREATE INDEX/DROP INDEX 문의 인덱스 이름은 대소문자를 구분했어요. 하지만 ALTER INDEX는 소문자로 만든 인덱스 이름을 요구했습니다(HIVE-2752). 이 버그는 Hive 0.13.0에서 모든 HiveQL 문장에 대해 인덱스 이름을 대소문자 비구분으로 만들어 고쳐졌어요. 0.13.0 이전 릴리스에서는 모든 인덱스 이름에 소문자를 쓰는 게 모범 사례입니다.

Create Index

CREATE INDEX index_name
  ON TABLE base_table_name (col_name, ...)
  AS index_type
  [WITH DEFERRED REBUILD]
  [IDXPROPERTIES (property_name=property_value, ...)]
  [IN TABLE index_table_name]
  [
     [ ROW FORMAT ...] STORED AS ...
     | STORED BY ...
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (...)]
  [COMMENT "index comment"];

CREATE INDEX는 주어진 컬럼 목록을 키로 사용해 테이블에 인덱스를 만들어요.

Drop Index

DROP INDEX [IF EXISTS] index_name ON table_name;

DROP INDEX는 인덱스 및 인덱스 테이블을 삭제해요.

Alter Index

ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

ALTER INDEX ... REBUILD는 WITH DEFERRED REBUILD 절로 만든 인덱스를 빌드하거나, 이전에 빌드된 인덱스를 다시 빌드합니다. PARTITION이 지정되면 그 파티션만 재빌드돼요.

Create/Drop Macro

버전 정보: Hive 0.12.0부터. Hive 0.12.0이 HiveQL에 매크로를 도입했고, 이전에는 Java에서만 만들 수 있었어요.

Create Temporary Macro

CREATE TEMPORARY MACRO macro_name([col_name col_type, ...]) expression;

CREATE TEMPORARY MACRO는 주어진 선택적 컬럼 목록을 식의 입력으로 사용하는 매크로를 만들어요. 매크로는 현재 세션 동안 존재합니다.

CREATE TEMPORARY MACRO fixed_number() 42;
CREATE TEMPORARY MACRO string_len_plus_two(x string) length(x) + 2;
CREATE TEMPORARY MACRO simple_add (x int, y int) x + y;

Drop Temporary Macro

DROP TEMPORARY MACRO [IF EXISTS] macro_name;

DROP TEMPORARY MACRO는 IF EXISTS가 지정되지 않으면 함수가 없을 때 오류를 반환합니다.

Create/Drop/Reload Function

Create Temporary Function

CREATE TEMPORARY FUNCTION function_name AS class_name;

이 문은 class_name이 구현하는 함수를 만들어요. 세션이 지속되는 동안 Hive 쿼리에서 이 함수를 사용할 수 있어요. 'ADD JAR' 문을 실행해 클래스패스에 jar를 추가할 수 있습니다. 이를 이용해 사용자 정의 함수(UDF)를 등록할 수 있어요. 신뢰할 수 있는 관리자만 이 권한을 가져야 합니다. Hive 클래스패스에서 임의 Java 코드를 실행할 수 있기 때문입니다.

Drop Temporary Function

DROP TEMPORARY FUNCTION [IF EXISTS] function_name;

Permanent Functions

Hive 0.13 이상에서는 함수를 metastore에 등록할 수 있어, 매 세션 임시 함수를 만들 필요 없이 쿼리에서 참조할 수 있어요.

CREATE FUNCTION [db_name.]function_name AS class_name
  [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];

이 문은 class_name이 구현하는 함수를 만들어요. 환경에 추가해야 하는 jar, 파일, 아카이브는 USING 절로 지정할 수 있어요. Hive 세션이 함수를 처음 참조할 때 이 리소스들이 ADD JAR/FILE을 실행한 것처럼 환경에 추가됩니다. Hive가 로컬 모드가 아니면 리소스 위치는 HDFS 위치 같은 비로컬 URI여야 해요. 함수는 지정된 데이터베이스(또는 생성 시점의 현재 데이터베이스)에 추가됩니다.

DROP FUNCTION [IF EXISTS] function_name;
RELOAD (FUNCTIONS|FUNCTION);

HIVE-2573부터, 한 Hive CLI 세션에서 영구 함수를 만들어도 함수 생성 전에 시작된 HiveServer2나 다른 Hive CLI 세션에는 반영되지 않을 수 있어요. HiveServer2나 HiveCLI 세션에서 RELOAD FUNCTIONS를 실행하면 다른 HiveCLI 세션이 수행한 영구 함수 변경을 반영할 수 있습니다. 하위 호환성을 위해 RELOAD FUNCTION;도 허용됩니다.

Create/Drop/Grant/Revoke Roles and Privileges

Hive deprecated authorization mode / Legacy Mode에 다음 DDL 문장에 대한 정보가 있습니다: CREATE ROLE, GRANT ROLE, REVOKE ROLE, GRANT privilege_type, REVOKE privilege_type, DROP ROLE, SHOW ROLE GRANT, SHOW GRANT.

Hive 0.13.0 이상의 SQL 표준 기반 인가에는 다음 DDL 문장이 있습니다: Role Management Commands(CREATE ROLE, GRANT ROLE, REVOKE ROLE, DROP ROLE, SHOW ROLES, SHOW ROLE GRANT, SHOW CURRENT ROLES, SET ROLE, SHOW PRINCIPALS), Object Privilege Commands(GRANT privilege_type, REVOKE privilege_type, SHOW GRANT).

Show

하위 섹션: Show Databases, Show Connectors, Show Tables/Views/Materialized Views/Partitions/Indexes, Show Columns, Show Functions, Show Granted Roles and Privileges, Show Locks, Show Conf, Show Transactions, Show Compactions.

이 문들은 이 Hive 시스템이 접근할 수 있는 기존 데이터와 메타데이터를 질의하는 방법을 제공해요.

Show Databases

SHOW (DATABASES|SCHEMAS) [LIKE 'identifier_with_wildcards'];

SHOW DATABASES 또는 SHOW SCHEMAS는 metastore에 정의된 모든 데이터베이스를 나열해요. 선택적 LIKE 절은 정규식으로 데이터베이스 목록을 필터링합니다. 와일드카드는 '*'(임의 문자) 또는 '|'(선택)만 가능해요.

Show Connectors

SHOW CONNECTORS;

Hive 4.0.0(HIVE-24396)부터. SHOW CONNECTORS는 metastore에 정의된 (사용자 접근에 따라) 모든 커넥터를 나열합니다.

Show Tables

SHOW TABLES [IN database_name] ['identifier_with_wildcards'];

SHOW TABLES는 선택적 정규식과 일치하는 이름을 가진 현재 데이터베이스(또는 IN 절로 명명한 것)의 모든 기본 테이블과 뷰를 나열합니다. 일치하는 테이블은 알파벳 순으로 나열됩니다. 정규식이 없으면 선택된 데이터베이스의 모든 테이블이 나열됩니다.

Show Views

버전 정보: Hive 2.2.0(HIVE-14558)에 도입.

SHOW VIEWS [IN/FROM database_name] [LIKE 'pattern_with_wildcards'];
SHOW VIEWS;                                -- show all views in the current database
SHOW VIEWS 'test_*';                       -- show all views that start with "test_"
SHOW VIEWS '*view2';                       -- show all views that end in "view2"
SHOW VIEWS LIKE 'test_view1|test_view2';   -- show views named either "test_view1" or "test_view2"
SHOW VIEWS FROM test1;                     -- show views from database test1
SHOW VIEWS IN test1;                       -- show views from database test1 (FROM and IN are same) 
SHOW VIEWS IN test1 "test_*";              -- show views from database test2 that start with "test_"

Show Materialized Views

SHOW MATERIALIZED VIEWS [IN/FROM database_name] [LIKE 'pattern_with_wildcards'];

SHOW MATERIALIZED VIEWS는 현재 데이터베이스(또는 IN/FROM 절로 명명한 것)의 이름이 선택적 정규식과 일치하는 모든 구체화 뷰를 나열합니다. 재작성 활성화 여부, 구체화 뷰의 리프레시 모드 같은 추가 정보도 보여줍니다.

Show Partitions

SHOW PARTITIONS table_name;

SHOW PARTITIONS는 주어진 기본 테이블의 모든 기존 파티션을 알파벳 순으로 나열해요. Hive 0.6부터 파티션 목록을 필터링할 수 있습니다.

SHOW PARTITIONS table_name PARTITION(ds='2010-03-03');            -- (Note: Hive 0.6 and later)
SHOW PARTITIONS table_name PARTITION(hr='12');                    -- (Note: Hive 0.6 and later)
SHOW PARTITIONS table_name PARTITION(ds='2010-03-03', hr='12');   -- (Note: Hive 0.6 and later)

Hive 0.13.0부터 데이터베이스를 지정할 수 있어요 (HIVE-5912):

SHOW PARTITIONS [db_name.]table_name [PARTITION(partition_spec)];   -- (Note: Hive 0.13.0 and later)

Hive 4.0.0부터 SHOW PARTITIONS는 선택적으로 WHERE/ORDER BY/LIMIT 절을 사용할 수 있어요 (HIVE-22458). 필터링에는 hr >= 10처럼 쓰고 hr - 10 >= 0은 쓰지 마세요. Metastore가 후자의 프레디킷을 하부 저장소로 밀어내지 못합니다.

Show Table/Partition Extended

SHOW TABLE EXTENDED [IN|FROM database_name] LIKE 'identifier_with_wildcards' [PARTITION(partition_spec)];

SHOW TABLE EXTENDED는 주어진 정규식과 일치하는 모든 테이블의 정보를 나열해요. 파티션 스펙이 있으면 테이블 이름에 정규식을 쓸 수 없습니다. 이 명령의 출력은 totalNumberFiles, totalFileSize, maxFileSize, minFileSize, lastAccessTime, lastUpdateTime 같은 기본 테이블 정보와 파일시스템 정보를 포함합니다.

Show Table Properties

버전 정보: Hive 0.10.0부터.

SHOW TBLPROPERTIES tblname;
SHOW TBLPROPERTIES tblname("foo");

첫 번째 형태는 해당 테이블의 모든 테이블 속성을 행마다 하나씩 탭으로 구분해 나열해요. 두 번째 형태는 요청한 속성의 값만 출력합니다.

Show Create Table

버전 정보: Hive 0.10부터.

SHOW CREATE TABLE ([db_name.]table_name|view_name);

SHOW CREATE TABLE은 주어진 테이블을 만드는 CREATE TABLE 문, 또는 주어진 뷰를 만드는 CREATE VIEW 문을 보여줍니다.

Show Indexes

버전 정보: Hive 0.7부터. (인덱싱은 3.0에서 제거됨.)

SHOW [FORMATTED] (INDEX|INDEXES) ON table_with_index [(FROM|IN) db_name];

SHOW INDEXES는 특정 컬럼의 모든 인덱스와 그 정보(인덱스 이름, 테이블 이름, 키로 쓰인 컬럼 이름, 인덱스 테이블 이름, 인덱스 타입, 코멘트)를 보여줍니다. FORMATTED 키워드를 쓰면 각 컬럼의 제목이 출력됩니다.

Show Columns

버전 정보: Hive 0.10부터.

SHOW COLUMNS (FROM|IN) table_name [(FROM|IN) db_name];
SHOW COLUMNS (FROM|IN) table_name [(FROM|IN) db_name]  [ LIKE 'pattern_with_wildcards'];   -- (Hive 3.0, HIVE-18373)

SHOW COLUMNS는 파티션 컬럼을 포함해 테이블의 모든 컬럼을 보여줍니다. LIKE로 이름이 정규식과 일치하는 컬럼을 나열할 수 있어요.

Show Functions

SHOW FUNCTIONS [LIKE "<pattern>"];

SHOW FUNCTIONS는 LIKE로 정규식이 지정되면 그로 필터링된 모든 사용자 정의 및 내장 함수를 나열해요.

Show Granted Roles and Privileges

  • SHOW ROLE GRANT, SHOW GRANT (deprecated/legacy 모드)
  • Hive 0.13.0+ SQL 표준 인가: SHOW ROLE GRANT, SHOW GRANT, SHOW CURRENT ROLES, SHOW ROLES, SHOW PRINCIPALS

Show Locks

SHOW LOCKS <table_name>;
SHOW LOCKS <table_name> EXTENDED;
SHOW LOCKS <table_name> PARTITION (<partition_spec>);
SHOW LOCKS <table_name> PARTITION (<partition_spec>) EXTENDED;
SHOW LOCKS (DATABASE|SCHEMA) database_name;     -- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)

SHOW LOCKS는 테이블이나 파티션의 락을 표시합니다. Hive 트랜잭션 사용 시 SHOW LOCKS는 데이터베이스 이름, 테이블 이름, 파티션 이름, 락의 상태("acquired","waiting","aborted"), 이 락을 막는 락의 ID, 락의 타입("exclusive","shared_read","shared_write"), 연관 트랜잭션 ID, 마지막 하트비트 시간, 락 획득 시간, 요청한 Hive 사용자, 호스트, 에이전트 정보를 반환합니다.

Show Conf

버전 정보: Hive 0.14.0부터.

SHOW CONF <configuration_name>;

SHOW CONF는 지정된 구성 속성의 설명(기본값, 요구 타입, 설명)을 반환합니다. SHOW CONF는 현재 값은 보여주지 않아요. 현재 속성 설정은 CLI/Beeline의 "set" 명령을 사용하세요.

Show Transactions

버전 정보: Hive 0.13.0부터.

SHOW TRANSACTIONS;

SHOW TRANSACTIONS는 관리자가 Hive 트랜잭션을 사용할 때 사용해요. 시스템에서 현재 열려 있고 중단된 모든 트랜잭션 목록(트랜잭션 ID, 상태, 시작한 사용자, 시작 머신, 시작 타임스탬프, 마지막 하트비트 타임스탬프)을 반환합니다.

Show Compactions

버전 정보: Hive 0.13.0부터.

SHOW COMPACTIONS [DATABASE.][TABLE] [PARTITION (<partition_spec>)] [POOL_NAME] [TYPE] [STATE] [ORDER BY `start` DESC] [LIMIT 10];

SHOW COMPACTIONS는 현재 처리 중이거나 예정된 모든 컴팩션 요청 목록을 반환합니다. 포함 정보: "CompactionId", "Database", "Table", "Partition", "Type"(major/minor), "State"("initiated","working","ready for cleaning","failed","succeeded","attempted"), "Worker", "Start Time", "Duration(ms)", "HadoopJobId", "Enqueue Time", "Initiator host", "TxnId", "Commit Time", "Highest WriteId", "Pool name", "Error message".

예제:

SHOW COMPACTIONS.
 -- show all compactions of all tables and partitions currently being compacted or scheduled  for compaction

SHOW COMPACTIONS DATABASE db1
 -- show all compactions of all tables from given database which are currently being compacted or scheduled for compaction

SHOW COMPACTIONS SCHEMA db1

SHOW COMPACTIONS tbl0

SHOW COMPACTIONS compactionid =1
 -- show all compactions with given compaction ID

SHOW COMPACTIONS db1.tbl0 PARTITION (p=101,day='Monday') POOL 'pool0' TYPE 'minor' STATUS 'ready for clean' ORDER BY cq_table DESC, cq_state LIMIT 42

컴팩션은 자동으로 시작되지만 ALTER TABLE COMPACT 문으로 수동 시작할 수도 있습니다.

Describe

하위 섹션: Describe Database, Describe Dataconnector, Describe Table/View/Materialized View/Column, Display Column Statistics, Describe Partition, Hive 2.0+: Syntax Change.

Describe Database

버전 정보: Hive 0.7부터.

DESCRIBE DATABASE [EXTENDED] db_name;
DESCRIBE SCHEMA [EXTENDED] db_name;     -- (Note: Hive 1.1.0 and later)

DESCRIBE DATABASE는 데이터베이스 이름, (설정된 경우) 코멘트, 파일시스템의 루트 위치를 보여줍니다. EXTENDED는 데이터베이스 속성도 보여줍니다.

Describe Dataconnector

DESCRIBE CONNECTOR [EXTENDED] connector_name;

Hive 4.0.0(HIVE-24396)부터. DESCRIBE CONNECTOR는 커넥터 이름, 코멘트, 데이터소스 URL과 타입을 보여줍니다. EXTENDED는 커넥터 속성도 보여주며, 설정된 평문 비밀번호도 평문으로 보입니다.

Describe Table/View/Materialized View/Column

데이터베이스 지정 여부에 따라 두 가지 형식이 있습니다. 데이터베이스를 지정하지 않으면 선택적 컬럼 정보는 점 뒤에 옵니다:

DESCRIBE [EXTENDED|FORMATTED]  
  table_name[.col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )* ];
                                        -- (Note: Hive 1.x.x and 0.x.x only. See "Hive 2.0+: New Syntax" below)

데이터베이스를 지정하면 선택적 컬럼 정보는 공백 뒤에 옵니다:

DESCRIBE [EXTENDED|FORMATTED]  
  [db_name.]table_name[ col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )* ];
                                        -- (Note: Hive 1.x.x and 0.x.x only. See "Hive 2.0+: New Syntax" below)

DESCRIBE는 주어진 테이블의 파티션 컬럼을 포함한 컬럼 목록을 보여줍니다. EXTENDED를 지정하면 Thrift 직렬화 형식의 모든 테이블 메타데이터를 보여줘요. 일반적으로 디버깅에만 유용합니다. FORMATTED를 지정하면 표 형식으로 메타데이터를 보여줍니다.

테이블에 복합 컬럼이 있으면 table_name.complex_col_name으로 그 컬럼의 속성을 살펴볼 수 있어요 (struct 요소는 field_name, array 요소는 '$elem$', map 키는 '$key$', map 값은 '$value$'). 복합 컬럼 타입을 탐색하려면 재귀적으로 지정할 수 있어요.

뷰의 경우 DESCRIBE EXTENDED 또는 FORMATTED로 뷰 정의를 가져올 수 있어요. 구체화 뷰의 경우 DESCRIBE EXTENDED/FORMATTED가 재작성 활성화 여부와, 사용 중인 소스 테이블 데이터 기준으로 자동 재작성에 적합한 최신 상태인지에 대한 추가 정보를 제공합니다.

Hive 0.10.0 이하에서는 DESCRIBE TABLE 표시 시 파티션/비파티션 컬럼을 구분하지 않았어요. 0.12.0부터는 따로 표시됩니다. hive.display.partition.cols.separately 구성 파라미터로 옛 동작을 쓸 수 있어요 (HIVE-6689).

Display Column Statistics

버전 정보: Hive 0.14.0부터 (HIVE-7050, HIVE-7051).

ANALYZE TABLE table_name COMPUTE STATISTICS FOR COLUMNS는 지정된 테이블의 모든 컬럼(파티셔닝된 테이블이면 모든 파티션)의 컬럼 통계를 계산해요. 수집된 컬럼 통계를 보려면:

DESCRIBE FORMATTED [db_name.]table_name column_name;                              -- (Note: Hive 0.14.0 and later)
DESCRIBE FORMATTED [db_name.]table_name column_name PARTITION (partition_spec);   -- (Note: Hive 0.14.0 to 1.x.x)

Describe Partition

데이터베이스 지정 여부에 따라 두 가지 형식이 있습니다.

DESCRIBE [EXTENDED|FORMATTED] table_name[.column_name] PARTITION partition_spec;
                                        -- (Note: Hive 1.x.x and 0.x.x only. See "Hive 2.0+: New Syntax" below)

DESCRIBE [EXTENDED|FORMATTED] [db_name.]table_name [column_name] PARTITION partition_spec;
                                        -- (Note: Hive 1.x.x and 0.x.x only. See "Hive 2.0+: New Syntax" below)

이 문은 주어진 파티션의 메타데이터를 나열해요. 출력은 DESCRIBE table_name과 비슷합니다.

hive> show partitions part_table;
OK
d=abc

hive> DESCRIBE extended part_table partition (d='abc');
OK
i                       int                                         
d                       string                                      
                 
# Partition Information          
# col_name              data_type               comment             
                 
d                       string                                      
                 
Detailed Partition Information  Partition(values:[abc], dbName:default, tableName:part_table, createTime:1459382234, lastAccessTime:0, sd:StorageDescriptor(...) )   
Time taken: 0.325 seconds, Fetched: 9 row(s)

Hive 2.0+: Syntax Change

Hive 2.0부터 describe table 명령에 하위 호환되지 않는 문법 변경이 있어요 (HIVE-12184).

DESCRIBE [EXTENDED | FORMATTED]
    [db_name.]table_name [PARTITION partition_spec] [col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )* ];

경고: 새 문법은 기존 스크립트를 깨뜨릴 수 있어요.

  • 더 이상 점으로 구분된 table_name과 column_name을 받지 않아요. 공백으로 구분해야 합니다. DB와 TABLENAME은 점으로 구분됩니다. column_name은 복합 데이터 타입에서 여전히 점을 포함할 수 있어요.
  • 선택적 partition_spec은 table_name 뒤, 선택적 column_name 앞에 와야 합니다.
DESCRIBE FORMATTED default.src_table PARTITION (part_col = 100) columnA;
DESCRIBE default.src_thrift lintString.$elem$.myint;

Abort Transactions

버전 정보: Hive 1.3.0과 2.1.0부터.

ABORT TRANSACTIONS transactionID [ transactionID ...];

ABORT TRANSACTIONS는 지정된 트랜잭션 ID를 Hive metastore에서 정리해, 사용자가 매달린(dangling) 또는 실패한 트랜잭션을 제거하기 위해 metastore와 직접 상호작용할 필요가 없게 해 줍니다. SHOW TRANSACTIONS와 함께 사용할 수 있어요.

ABORT TRANSACTIONS 0000007 0000008 0000010 0000015;

관련 문서

  • Scheduled queries, Datasketches integration 문서가 별도로 제공됩니다.
  • HCatalog/WebHCat DDL: HCatalog DDL(HCatalog 매뉴얼), WebHCat DDL Resources(WebHCat 매뉴얼) 참고.

더 알아보기 (Learn more)

DDL은 Hive 데이터 모델의 토대예요. 중요한 규칙을 정리하면: (1) 테이블/컬럼 이름은 대소문자 무관, SerDe·속성 이름은 대소문자 구분, (2) EXTERNAL 테이블 drop 시 데이터는 지워지지 않고, (3) 파티션 컬럼을 테이블 컬럼으로 겹치게 하면 안 됩니다. CTAS/CREATE TABLE LIKE로 테이블을 만드는 패턴과 MSCK REPAIR로 파티션을 동기화하는 방법도 꼭 알아두세요.