INSERT 문
INSERT 문 (INSERT Statements)
Hive dialect의 INSERT 문을 사용하면 테이블에 행을 삽입하거나 파일시스템 디렉토리에 결과를 쓸 수 있습니다. 여러 대상으로 한 번에 삽입하는 다중 삽입도 지원합니다.
출처: 문서
본문
INSERT TABLE
설명
INSERT TABLE 문은 테이블에 행을 삽입하거나 테이블의 기존 데이터를 덮어쓰는 데 사용됩니다. 삽입할 행은 값 표현식(Value expression)이나 쿼리 결과로 지정할 수 있습니다.
문법
-- 표준 문법
INSERT { OVERWRITE TABLE | INTO [TABLE] } tablename
[PARTITION (partcol1[=val1], partcol2[=val2] ...) [IF NOT EXISTS]]
{ VALUES ( value [, ..] ) [, ( ... ) ] | select_statement FROM from_statement }
파라미터
-
OVERWRITE TABLEOVERWRITE TABLE을 지정하면 테이블이나 파티션에 존재하는 데이터를 모두 덮어씁니다. -
PARTITION ( ... )테이블의 특정 파티션에 데이터를 삽입하기 위한 옵션입니다.PARTITION절을 지정하면 테이블은 파티션 테이블이어야 합니다. -
VALUES ( value [, ..] ) [, ( ... ) ]삽입할 값을 명시적으로 지정합니다. 절 안에서 각 값은 쉼표로 구분해야 합니다. 여러 행을 삽입하려면 값 집합을 여러 개 지정할 수 있습니다. -
select_statement쿼리를 위한 문장입니다. 자세한 내용은 queries를 참고하세요.
요약 (Synopsis)
동적 파티션 삽입 (Dynamic Partition Inserts)
Hive 테이블의 파티션에 데이터를 쓸 때, 사용자는 PARTITION 절에 선택적인 열 값과 함께 파티션 열 이름 목록을 지정할 수 있습니다. 모든 파티션 열의 값이 주어졌다면 이를 정적 파티션(static partition)이라 하고, 그렇지 않으면 동적 파티션(dynamic partition)이라 합니다.
각 동적 파티션 열은 SELECT 문의 입력 열에 대응합니다. 즉 동적 파티션 생성은 입력 열의 값에 의해 결정됩니다.
동적 파티션 열은 SELECT 문의 열 중 마지막에, 그리고 PARTITION() 절에 나타나는 순서와 동일한 순서로 지정해야 합니다.
참고: Hive에서 기본적으로는 실수로 모든 파티션을 덮어쓰는 것을 방지하기 위해 최소 하나의 정적 파티션을 지정해야 하며, 모든 파티션이 동적이 되도록 하려면
hive.exec.dynamic.partition.mode설정을nonstrict로 바꿀 수 있습니다.하지만 Flink의 Hive dialect에서는 항상
nonstrict모드가 되므로 모든 파티션이 동적으로 허용됩니다.
예제
-- values를 사용해 테이블에 삽입
INSERT INTO t1 VALUES ('k1', 'v1'), ('k2', 'v2');
-- insert overwrite
INSERT OVERWRITE TABLE t1 VALUES ('k1', 'v1'), ('k2', 'v2');
-- select 문을 사용해 테이블에 삽입
INSERT INTO TABLE t1 SELECT * FROM t2;
-- 파티션에 삽입
-- 정적 파티션
INSERT INTO t1 PARTITION (year = 2022, month = 12) SELECT value FROM t2;
-- 동적 파티션
INSERT INTO t1 PARTITION (year = 2022, month) SELECT value, month FROM t2;
INSERT INTO t1 PARTITION (year, month) SELECT value, 2022, month FROM t2;
INSERT OVERWRITE DIRECTORY
설명
쿼리 결과는 아래 문법의 약간 변형된 형태로 파일시스템 디렉토리에 삽입할 수 있습니다.
-- 표준 문법
INSERT OVERWRITE [LOCAL] DIRECTORY directory_path
[ROW FORMAT row_format] [STORED AS file_format]
{ VALUES ( value [, ..] ) [, ( ... ) ] | select_statement FROM from_statement }
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]
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, ...)]
파라미터
-
directory_path삽입 대상 디렉토리의 경로로, 전체 URI가 될 수 있습니다. 스킴(scheme)이나 authority가 지정되지 않으면 Flink 설정 변수fs.default-scheme가 가리키는 파일시스템 스킴을 사용합니다. -
LOCAL선택적 키워드입니다.LOCAL을 사용하면 Flink가 로컬 파일시스템의 디렉토리에 데이터를 씁니다. -
VALUES ( value [, ..] ) [, ( ... ) ]삽입할 값을 명시적으로 지정합니다. 각 값은 쉼표로 구분해야 하며, 여러 집합을 지정해 여러 행을 삽입할 수 있습니다. -
select_statement쿼리 문장입니다. 자세한 내용은 queries를 참고하세요. -
STORED AS file_format삽입에 사용할 파일 포맷을 지정합니다. 유효한 값은TEXTFILE,ORC,PARQUET,AVRO,RCFILE,SEQUENCEFILE,JSONFILE입니다. 자세한 내용은 Hive의 Storage Formats 문서를 참고하세요. -
row_format이 삽입에 대한 행 포맷을 지정합니다. 자세한 내용은 Hive의 RowFormat 문서를 참고하세요.
예제
-- 특정 포맷으로 디렉토리에 삽입
INSERT OVERWRITE DIRECTORY '/user/hive/warehouse/t1' STORED AS ORC SELECT * FROM t1;
-- 특정 행 포맷으로 로컬 디렉토리에 삽입
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/t1'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ':'
COLLECTION ITEMS TERMINATED BY '#'
MAP KEYS TERMINATED BY '=' SELECT * FROM t1;
다중 삽입 (Multiple Inserts)
Hive dialect는 사용자가 하나의 문장으로 여러 대상에 삽입하는 것을 지원합니다. 테이블 삽입과 디렉토리 삽입을 하나의 문장에 섞을 수 있습니다. 이런 문법에서 Flink는 필요한 데이터 스캔 횟수를 최소화하며, 입력 데이터를 한 번만 스캔하고도 여러 테이블/디렉토리에 삽입할 수 있습니다.
문법
-- 테이블로의 다중 삽입
FROM from_statement
INSERT { OVERWRITE TABLE | INTO [TABLE] } tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1,
INSERT { OVERWRITE TABLE | INTO [TABLE] } tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2
[, ... ]
-- 디렉토리로의 다중 삽입
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1_path [ROW FORMAT row_format] [STORED AS file_format] select_statement1,
INSERT OVERWRITE [LOCAL] DIRECTORY directory2_path [ROW FORMAT row_format] [STORED AS file_format] select_statement2
[, ... ]
예제
-- 테이블로의 다중 삽입
FROM (SELECT month, value from t1) t
INSERT OVERWRITE TABLE t1_1 SELECT value WHERE month <= 6
INSERT OVERWRITE TABLE t1_2 SELECT value WHERE month > 6;
-- 디렉토리로의 다중 삽입
FROM (SELECT month, value from t1) t
INSERT OVERWRITE DIRECTORY '/user/hive/warehouse/t1/month1' SELECT value WHERE month <= 6
INSERT OVERWRITE DIRECTORY '/user/hive/warehouse/t1/month2' SELECT value WHERE month > 6;
-- 하나의 문장에 테이블/디렉토리 삽입 혼합
FROM (SELECT month, value from t1) t
INSERT OVERWRITE TABLE t1_1 SELECT value WHERE month <= 6
INSERT OVERWRITE DIRECTORY '/user/hive/warehouse/t1/month2' SELECT value WHERE month > 6;