HiveQL 데이터 조작 언어

HiveQL 데이터 조작 언어 (LanguageManual DML)

테이블 구조를 만들었다면 이제 데이터를 넣고 빼고 바꿔야 해요. HiveQL의 데이터 조작 언어(DML)는 LOAD, INSERT, UPDATE, DELETE, MERGE 같은 문장으로 데이터를 수정하는 방법을 정의해요. EXPORT와 IMPORT도 Hive 0.8부터 사용할 수 있어요.

출처: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML

파일에 있는 데이터를 테이블로 가져올 때는 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]를 써요. LOAD는 데이터를 변환하지 않는 순수 복사/이동 작업이에요. LOCAL 키워드가 있으면 로컬 파일시스템에서, 없으면 하둡 설정 fs.default.name이 가리키는 파일시스템에서 파일을 가져와요. OVERWRITE를 쓰면 대상 테이블(또는 파티션)의 기존 내용을 지우고 바꿔요. Hive 3.0부터는 LOAD를 내부적으로 INSERT AS SELECT로 재작성해 파티션·버킷 테이블 같은 복잡한 경우도 지원해요.

조회 결과를 테이블에 넣을 때는 INSERT를 사용해요. INSERT OVERWRITE TABLE tablename1 [PARTITION ...] select_statement1 FROM from_statement;는 기존 데이터를 덮어쓰고, INSERT INTO TABLE tablename1 ... select_statement1 FROM from_statement;는 기존 데이터를 유지한 채 추가해요(INSERT INTO는 Hive 0.8부터). 여러 INSERT 절을 같은 쿼리에 두는 **멀티 테이블 인서트(Multi Table Insert)**도 가능해요. 동적 파티션 인서트는 INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...)처럼 파티션 컬럼에 값을 생략해 런타임에 파티션을 만들어요.

쿼리 결과를 파일시스템의 디렉터리로 내보낼 수도 있어요. INSERT OVERWRITE [LOCAL] DIRECTORY directory1 구문을 쓰면 쿼리 결과가 지정 디렉터리에 저장돼요. LOCAL이 있으면 로컬 파일시스템으로, 없으면 HDFS로 내보내요. 출력 포맷은 ROW FORMAT DELIMITED ... STORED AS ...로 제어할 수 있어요.

ACID 트랜잭션을 지원하는 테이블에서는 행 단위 수정이 가능해요. UPDATE tablename SET column = value [, column = value ...] WHERE expression;는 조건에 맞는 행을 갱신하고, DELETE FROM tablename [WHERE expression];은 조건에 맞는 행만 삭제해요. 두 문장 모두 Hive 0.14부터 사용 가능하며, 벡터화(vectordization)가 자동으로 꺼져요. UPDATE에서는 버킷팅 컬럼을 바꿀 수 없어요.

Hive 2.2부터는 MERGE INTO <target table> AS T USING <source expression/table> AS S ON <boolean expression1> WHEN MATCHED [AND ...] THEN UPDATE SET <set clause list> WHEN MATCHED [AND ...] THEN DELETE WHEN NOT MATCHED [AND ...] THEN INSERT VALUES <value list>로 타깃과 소스 조인 결과에 따라 삽입·갱신·삭제를 한 번에 할 수 있어요. WHEN 절은 최대 3개(UPDATE/DELETE/INSERT 각각 1개)까지 가능하고, WHEN NOT MATCHED는 마지막에 와야 해요. hive.merge.cardinality.check=false로 ON 조건 중복 검사를 끌 수 있지만, 위험하니 신중해야 해요.

UPDATE/DELETE/MERGE는 모두 ACID를 지원하는 테이블에서만 동작해요. Hive Transactions 문서에서 트랜잭션 테이블 요건을 확인하세요. 그리고 벡터화는 UPDATE/DELETE/MERGE 동안 자동으로 꺼지지만, 갱신된 테이블은 벡터화로 계속 조회할 수 있어요.

더 알아보기

  • ACID 트랜잭션 요건은 Hive Transactions에서
  • EXPORT/IMPORT 명령은 LanguageManual ImportExport에서