HPL/SQL - INSERT 문
HPL/SQL - INSERT 문
INSERT 문은 테이블에 행을 삽입할 때 사용해요. SELECT 결과를 넣을 수도 있고, VALUES로 직접 값을 지정해서 넣을 수도 있습니다.
출처: 문서
본문
문법(Syntax):
SELECT로부터 삽입:
INSERT OVERWRITE TABLE table_name select_statement
|
INSERT INTO [TABLE] table_name select_statement
값을 직접 지정해서 삽입:
INSERT INTO [TABLE] table_name VALUES (exrp, expr2, ...) [, (exrp, expr2, ...), ...]
INSERT VALUES
HPL/SQL은 INSERT VALUES 문을 처리하는 두 가지 방식을 제공해요. native와 select 방식입니다. hplsql.insert.values 옵션으로 방식을 정하며 기본값은 native예요.
Native INSERT VALUES
hplsql.insert.values가 native로 설정되면 HPL/SQL은 INSERT VALUES 문법을 지원하는 데이터베이스에 그대로 의존해요. 참고로 INSERT VALUES는 Hive 0.14 버전부터 사용할 수 있고, ACID를 지원하는 테이블에서만 수행할 수 있습니다.
SELECT로 변환(Transform into INSERT SELECT)
hplsql.insert.values가 select로 설정되면 HPL/SQL은 VALUES 절을 SELECT ... FROM dual UNION ALL ... 목록으로 변환해요.
예를 들어 다음 INSERT 문을 실행하면:
INSERT INTO dept VALUES
(10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');
HPL/SQL은 이를 다음과 같이 변환해요:
INSERT INTO dept
SELECT 10, 'ACCOUNTING', 'NEW YORK' FROM default.dual
UNION ALL
SELECT 20, 'RESEARCH', 'DALLAS' FROM default.dual
UNION ALL
SELECT 30, 'SALES', 'CHICAGO' FROM default.dual
UNION ALL
SELECT 40, 'OPERATIONS', 'BOSTON' FROM default.dual;
단일 행, 단일 컬럼의 dual 테이블은 hplsql.dual.table 옵션으로 지정할 수 있어요.
중요 참고(Important Note): 이 방식은 INSERT 문 하나당 HDFS 파일 하나를 만들기 때문에, 대량의 행을 삽입할 때는 사용하면 안 됩니다.
호환성(Compatibility): Oracle, Microsoft SQL Server, IBM DB2, Teradata, PostgreSQL, MySQL
더 알아보기 (Learn more)
INSERT OVERWRITE는 기존 데이터를 덮어쓰고, INSERT INTO는 데이터를 추가해요. Hive의 파티션 테이블과 함께 쓸 때 동작 방식이 다르니 관련 문서도 함께 확인해 보세요.