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 TABLE OVERWRITE 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;

더 알아보기 (Learn more)