Hive 데이터 조작 언어
Hive 데이터 조작 언어 (LanguageManual DML)
Hive의 DML은 테이블에 파일을 로드하고, 쿼리 결과를 테이블에 삽입하며, 데이터를 파일시스템에 쓰고, UPDATE·DELETE·MERGE 같은 변경을 수행하는 문법을 다뤄요. 데이터 적재와 변경의 핵심을 정리했어요.
출처: 문서
본문
Hive 데이터 조작 언어
테이블에 파일 로드하기
Hive는 데이터를 테이블에 로드할 때 어떤 변환도 수행하지 않습니다. 로드 연산은 현재 데이터 파일을 Hive 테이블에 해당하는 위치로 옮기는 순수 copy/move 연산입니다.
구문
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [INPUTFORMAT 'inputformat' SERDE 'serde'] (3.0 이상)
개요
Hive 3.0 이전의 로드 연산은 데이터 파일을 Hive 테이블에 해당하는 위치로 옮기는 순수 copy/move 연산입니다.
- filepath 는 다음이 될 수 있습니다:
- 상대 경로(예:
project/data1) - 절대 경로(예:
/user/hive/project/data1) - scheme과 (선택적으로) authority를 가진 전체 URI(예:
hdfs://namenode:9000/user/hive/project/data1)
- 상대 경로(예:
- 로드 대상은 테이블 또는 파티션일 수 있습니다. 테이블이 파티션되어 있으면 모든 파티셔닝 컬럼에 대해 값을 지정해 테이블의 특정 파티션을 지정해야 합니다.
- filepath 는 파일(이 경우 Hive가 파일을 테이블로 이동)을 가리킬 수도 있고 디렉터리(이 경우 Hive가 해당 디렉터리의 모든 파일을 테이블로 이동)를 가리킬 수도 있습니다. 어느 경우든 filepath 는 파일 집합을 가리킵니다.
- LOCAL 키워드를 지정하면:
- 로드 명령은 로컬 파일 시스템에서 filepath 를 찾습니다. 상대 경로를 지정하면 사용자의 현재 작업 디렉터리 기준으로 해석됩니다. 로컬 파일에 대해 전체 URI를 지정할 수도 있습니다. 예:
<file:///user/hive/project/data1> - 로드 명령은 filepath 가 가리키는 모든 파일을 대상 파일시스템으로 복사하려 시도합니다. 대상 파일시스템은 테이블의 location 속성을 보고 유추합니다. 복사된 데이터 파일은 테이블로 이동됩니다.
- 참고: HiveServer2 인스턴스에 대해 이 명령을 실행하면 로컬 경로는 HiveServer2 인스턴스의 경로를 가리킵니다. HiveServer2에 해당 파일 접근 권한이 있어야 합니다.
- 로드 명령은 로컬 파일 시스템에서 filepath 를 찾습니다. 상대 경로를 지정하면 사용자의 현재 작업 디렉터리 기준으로 해석됩니다. 로컬 파일에 대해 전체 URI를 지정할 수도 있습니다. 예:
- LOCAL 키워드를 지정하지 않으면 Hive는 filepath 의 전체 URI(지정된 경우)를 사용하거나 다음 규칙을 적용합니다:
- scheme 또는 authority를 지정하지 않으면 Hive는 Namenode URI를 지정하는 hadoop 설정 변수
fs.default.name의 scheme과 authority를 사용합니다. - 경로가 절대 경로가 아니면 Hive는
/user/<username>기준으로 해석합니다. - Hive는 filepath 가 가리키는 파일을 테이블(또는 파티션)로 이동 합니다.
- scheme 또는 authority를 지정하지 않으면 Hive는 Namenode URI를 지정하는 hadoop 설정 변수
- OVERWRITE 키워드를 사용하면 대상 테이블(또는 파티션)의 내용이 삭제되고 filepath 가 가리키는 파일로 대체됩니다. 그렇지 않으면 filepath 가 가리키는 파일이 테이블에 추가됩니다.
Hive 3.0 이상에서는 내부적으로 로드를 INSERT AS SELECT로 재작성하면서 추가 로드 연산을 지원합니다.
- 테이블에 파티션이 있지만 로드 명령에 파티션이 없으면 로드는 INSERT AS SELECT로 변환되고 마지막 컬럼 집합이 파티션 컬럼이라고 가정합니다. 파일이 예상 스키마에 부합하지 않으면 오류가 발생합니다.
- 테이블이 bucketed이면 다음 규칙이 적용됩니다:
- 엄격 모드(strict mode): INSERT AS SELECT 작업을 실행합니다.
- 비엄격 모드(non-strict mode): 파일 이름이 명명 규약에 맞으면(bucket 0에 속하면 000000_0 또는 000000_0_copy_1, bucket 2에 속하면 000002_0 또는 000002_0_copy_3 등) 순수 copy/move 연산이 되고, 아니면 INSERT AS SELECT 작업을 실행합니다.
- filepath 는 각 파일이 스키마에 맞다면 하위 디렉터리를 포함할 수 있습니다.
- inputformat 은 text, ORC 등 어떤 Hive 입력 포맷이든 될 수 있습니다.
- serde 는 관련 Hive SERDE일 수 있습니다.
- inputformat 과 serde 모두 대소문자를 구분합니다.
그런 스키마의 예:
CREATE TABLE tab1 (col1 int, col2 int) PARTITIONED BY (col3 int) STORED AS ORC;
LOAD DATA LOCAL INPATH 'filepath' INTO TABLE tab1;
여기서 파티션 정보가 빠져 있어 일반적으로 오류가 나지만, filepath 의 파일이 각 행이 파티션 컬럼으로 끝나는 테이블 스키마에 맞는다면 로드는 INSERT AS SELECT 작업으로 재작성됩니다.
비압축 데이터는 다음과 같아야 합니다:
(1,2,3), (2,3,4), (4,5,3) 등
참고 사항
- filepath 는 하위 디렉터리를 포함할 수 없습니다(위에서 설명한 Hive 3.0 이상 제외).
- LOCAL 키워드를 주지 않으면 filepath 는 테이블(또는 파티션) 위치와 같은 파일시스템의 파일을 가리켜야 합니다.
- Hive는 로드되는 파일이 대상 테이블과 일치하는지 최소한의 검사를 합니다. 현재는 테이블이 sequencefile 형식으로 저장되면 로드되는 파일도 sequencefile인지(그 반대도) 확인합니다.
- 이름에 "+" 문자가 포함된 파일을 로드하지 못하던 버그는 0.13.0 릴리스에서 수정되었습니다(HIVE-6048).
- 데이터 파일이 압축되어 있으면 CompressedStorage를 읽어 주세요.
쿼리에서 Hive 테이블로 데이터 삽입하기
insert 절을 사용해 쿼리 결과를 테이블에 삽입할 수 있습니다.
구문
표준 구문:
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
Hive 확장 (다중 insert):
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2]
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] ...;
FROM from_statement
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2]
[INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2] ...;
Hive 확장 (동적 파티션 insert):
INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
개요
- INSERT OVERWRITE는 테이블 또는 파티션의 기존 데이터를 덮어씁니다.
- 파티션에
IF NOT EXISTS를 제공하지 않는 한(Hive 0.9.0부터). - Hive 2.3.0(HIVE-15880)부터, 테이블이
TBLPROPERTIES ("auto.purge"="true")를 가지면 INSERT OVERWRITE 쿼리를 실행할 때 테이블의 이전 데이터가 Trash로 이동되지 않습니다. 이 기능은 관리형 테이블에만 적용되며 "auto.purge" 속성이 설정되지 않거나 false로 설정되면 꺼집니다.
- 파티션에
- INSERT INTO는 기존 데이터를 유지한 채 테이블 또는 파티션에 추가합니다. (참고: INSERT INTO 구문은 버전 0.8부터만 사용 가능.)
- Hive 0.13.0부터, 테이블을
TBLPROPERTIES ("immutable"="true")로 만들면 불변(immutable) 으로 만들 수 있습니다. 기본값은 "immutable"="false"입니다. 이미 데이터가 있으면 immutable 테이블에 대한 INSERT INTO 동작은 허용되지 않지만, immutable 테이블이 비어 있으면 INSERT INTO는 여전히 동작합니다. INSERT OVERWRITE의 동작은 "immutable" 테이블 속성의 영향을 받지 않습니다. immutable 테이블은 데이터를 로드하는 스크립트가 실수로 여러 번 실행되어 발생하는 우발적 업데이트로부터 보호됩니다. immutable 테이블에 대한 첫 번째 insert는 성공하고 이후 insert는 실패하여, 테이블에 데이터의 여러 복사본이 조용히 저장되는 대신 한 세트의 데이터만 남습니다.
- Hive 0.13.0부터, 테이블을
- 삽입은 테이블 또는 파티션에 대해 수행할 수 있습니다. 테이블이 파티션되어 있으면 모든 파티셔닝 컬럼에 대한 값을 지정해 테이블의 특정 파티션을 지정해야 합니다. hive.typecheck.on.insert가 true로 설정되면(Hive 0.12.0 이후) 이러한 값이 검증되고, 컬럼 타입에 맞게 변환·정규화됩니다.
- 같은 쿼리에 여러 insert 절(Multi Table Insert 라고도 함)을 지정할 수 있습니다.
- 각 select 문의 출력은 선택한 테이블(또는 파티션)에 기록됩니다. 현재 OVERWRITE 키워드는 필수이며, 선택한 테이블 또는 파티션의 내용이 해당 select 문의 출력으로 대체됨을 의미합니다.
- 출력 형식과 직렬화 클래스는 테이블의 메타데이터(테이블에 대한 DDL 명령으로 지정된)에 의해 결정됩니다.
- Hive 0.14부터, 테이블이 AcidOutputFormat을 구현하는 OutputFormat을 가지고 시스템이 ACID를 구현하는 transaction 관리자를 사용하도록 구성된 경우, 해당 테이블에서는 INSERT OVERWRITE가 비활성화됩니다. 이는 사용자가 실수로 트랜잭션 기록을 덮어쓰지 않도록 하기 위함입니다. 동일한 기능은 TRUNCATE TABLE(비파티션 테이블의 경우) 또는 DROP PARTITION 후 INSERT INTO로 달성할 수 있습니다.
- Hive 1.1.0부터 TABLE 키워드는 선택 사항입니다.
- Hive 1.2.0부터 각 INSERT INTO T는 INSERT INTO T (z, x, c1)처럼 컬럼 목록을 받을 수 있습니다. 예제는 HIVE-9481 설명을 참고하세요.
- Hive 3.1.0부터 full CRUD ACID 테이블에 대해 UNION ALL 소스에서 INSERT OVERWRITE하는 것은 허용되지 않습니다.
참고 사항
- Multi Table Insert는 필요한 데이터 스캔 수를 최소화합니다. Hive는 입력 데이터를 한 번만 스캔하고(다른 쿼리 연산자를 적용해) 여러 테이블에 데이터를 삽입할 수 있습니다.
- Hive 0.13.0부터 select 문은 SELECT 구문에 표시된 것처럼 하나 이상의 공통 테이블 표현식(CTE)을 포함할 수 있습니다. 예제는 Common Table Expression을 참고하세요.
동적 파티션 Insert
버전 정보: 이 정보는 Hive 0.12의 상황을 반영합니다. 동적 파티션 insert는 Hive 0.6에서 추가되었습니다.
동적 파티션 insert에서 사용자는 부분 파티션 사양을 줄 수 있습니다. 즉 PARTITION 절에 파티션 컬럼 이름 목록만 지정하는 것입니다. 컬럼 값은 선택 사항입니다. 파티션 컬럼 값이 주어지면 정적 파티션(static partition)이라 하고, 그렇지 않으면 동적 파티션(dynamic partition)이라고 합니다. 각 동적 파티션 컬럼은 select 문의 해당 입력 컬럼을 갖습니다. 즉 동적 파티션 생성은 입력 컬럼의 값에 의해 결정됩니다. 동적 파티션 컬럼은 SELECT 문의 컬럼 중 마지막에 그리고 PARTITION() 절에 나타나는 것과 같은 순서로 지정해야 합니다. Hive 3.0.0(HIVE-19083)부터 동적 파티션 컬럼을 지정할 필요가 없습니다. Hive가 지정되지 않은 경우 파티션 사양을 자동으로 생성합니다.
동적 파티션 insert는 Hive 0.9.0 이전에는 기본적으로 비활성화되어 있고 Hive 0.9.0 이후에는 기본적으로 활성화되어 있습니다. 동적 파티션 insert에 대한 관련 구성 속성은 다음과 같습니다:
| 구성 속성 | 기본값 | 참고 |
|---|---|---|
hive.exec.dynamic.partition |
true |
동적 파티션 insert를 활성화하려면 true로 설정해야 함 |
hive.exec.dynamic.partition.mode |
strict |
strict 모드에서는 사용자가 실수로 모든 파티션을 덮어쓰는 경우를 대비해 최소한 하나의 정적 파티션을 지정해야 하고, nonstrict 모드에서는 모든 파티션이 동적일 수 있음 |
hive.exec.max.dynamic.partitions.pernode |
100 | 각 mapper/reducer 노드에서 생성할 수 있는 최대 동적 파티션 수 |
hive.exec.max.dynamic.partitions |
1000 | 전체적으로 생성할 수 있는 최대 동적 파티션 수 |
hive.exec.max.created.files |
100000 | MapReduce 작업에서 모든 mapper/reducer가 만드는 최대 HDFS 파일 수 |
hive.error.on.empty.partition |
false |
동적 파티션 insert가 빈 결과를 생성하면 예외를 던질지 여부 |
예제
FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country)
SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip, pvs.cnt
여기서 country 파티션은 SELECT 절의 마지막 컬럼(즉 pvs.cnt)에 의해 동적으로 생성됩니다. 이름은 사용되지 않는다는 점에 유의하세요. nonstrict 모드에서는 dt 파티션도 동적으로 생성될 수 있습니다.
추가 문서
- Design Document
- 튜토리얼: Dynamic-Partition Insert
- HCatalog Dynamic Partitioning
- Pig와의 사용
- MapReduce에서의 사용
쿼리에서 파일시스템으로 데이터 쓰기
위 구문의 약간의 변형을 사용해 쿼리 결과를 파일시스템 디렉터리에 삽입할 수 있습니다.
구문
표준 구문:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
[ROW FORMAT row_format] [STORED AS file_format] (참고: Hive 0.11.0부터만 사용 가능)
SELECT ... FROM ...
Hive 확장 (다중 insert):
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] ...
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] (참고: Hive 0.13부터만 사용 가능)
개요
- Directory는 전체 URI일 수 있습니다. scheme 또는 authority를 지정하지 않으면 Hive는 Namenode URI를 지정하는 hadoop 설정 변수
fs.default.name의 scheme과 authority를 사용합니다. - LOCAL 키워드를 사용하면 Hive는 로컬 파일시스템의 디렉터리에 데이터를 씁니다.
- 파일시스템에 기록되는 데이터는 텍스트로 직렬화되며 컬럼은 ^A로, 행은 줄바꿈으로 구분됩니다. 컬럼 중 기본 타입이 아닌 것이 있으면 해당 컬럼은 JSON 형식으로 직렬화됩니다.
참고 사항
- 디렉터리, 로컬 디렉터리, 테이블(또는 파티션)에 대한 INSERT OVERWRITE 문은 모두 같은 쿼리 내에서 함께 사용할 수 있습니다.
- HDFS 파일시스템 디렉터리에 대한 INSERT OVERWRITE 문은 Hive에서 대량 데이터를 추출하는 가장 좋은 방법입니다. Hive는 map-reduce 작업 내에서 HDFS 디렉터리에 병렬로 쓸 수 있습니다.
- 디렉터리는 예상대로 OVERWRITE됩니다. 즉 지정된 경로가 존재하면 덮어쓰여 출력으로 대체됩니다.
- Hive 0.11.0부터 사용되는 구분자를 지정할 수 있습니다. 이전 버전에서는 항상 ^A 문자(\001)였습니다. 그러나 커스텀 구분자는 Hive 0.11.0~1.1.0에서 LOCAL 쓰기만 지원됩니다. 이 버그는 1.2.0에서 수정되었습니다(HIVE-5672).
- Hive 0.14에서 ACID 규격 테이블에 대한 insert는 select와 insert 동안 벡터화를 비활성화합니다. 이는 자동으로 수행됩니다. 데이터가 삽입된 ACID 테이블도 벡터화를 사용해 여전히 쿼리할 수 있습니다.
SQL에서 테이블로 값 삽입하기
INSERT…VALUES 문은 SQL에서 직접 테이블에 데이터를 삽입하는 데 사용할 수 있습니다.
버전 정보: INSERT…VALUES는 Hive 0.14부터 사용할 수 있습니다.
구문
표준 구문:
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]
values_row는 다음과 같습니다:
( value [, value ...] )
여기서 value는 null 또는 유효한 SQL 리터럴입니다.
개요
- VALUES 절에 나열된 각 행은 테이블 tablename 에 삽입됩니다.
- 테이블의 모든 컬럼에 대한 값을 제공해야 합니다. 사용자가 일부 컬럼에만 값을 삽입할 수 있게 하는 표준 SQL 구문은 아직 지원되지 않습니다. 표준 SQL을 흉내 내려면 사용자가 값을 할당하고 싶지 않은 컬럼에 null을 제공할 수 있습니다.
- 동적 파티셔닝은 INSERT…SELECT와 같은 방식으로 지원됩니다.
- 삽입 대상 테이블이 ACID를 지원하고 ACID를 지원하는 트랜잭션 관리자를 사용 중이면, 이 연산은 성공적으로 완료되면 자동 커밋됩니다.
- Hive는 복합 타입(array, map, struct, union)에 대한 리터럴을 지원하지 않으므로 INSERT INTO…VALUES 절에서 사용할 수 없습니다. 즉 사용자는 INSERT INTO…VALUES 절을 사용해 복합 데이터 타입 컬럼에 데이터를 삽입할 수 없습니다.
예제
CREATE TABLE students (name VARCHAR(64), age INT, gpa DECIMAL(3, 2))
CLUSTERED BY (age) INTO 2 BUCKETS STORED AS ORC;
INSERT INTO TABLE students
VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);
CREATE TABLE pageviews (userid VARCHAR(64), link STRING, came_from STRING)
PARTITIONED BY (datestamp STRING) CLUSTERED BY (userid) INTO 256 BUCKETS STORED AS ORC;
INSERT INTO TABLE pageviews PARTITION (datestamp = '2014-09-23')
VALUES ('jsmith', 'mail.com', 'sports.com'), ('jdoe', 'mail.com', null);
INSERT INTO TABLE pageviews PARTITION (datestamp)
VALUES ('tjohnson', 'sports.com', 'finance.com', '2014-09-23'), ('tlee', 'finance.com', null, '2014-09-21');
INSERT INTO TABLE pageviews
VALUES ('tjohnson', 'sports.com', 'finance.com', '2014-09-23'), ('tlee', 'finance.com', null, '2014-09-21');
Update
버전 정보: UPDATE는 Hive 0.14부터 사용할 수 있습니다.
Update는 ACID를 지원하는 테이블에서만 수행할 수 있습니다. 자세한 내용은 Hive Transactions를 참고하세요.
구문
표준 구문:
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
개요
- 참조되는 컬럼은 업데이트 중인 테이블의 컬럼이어야 합니다.
- 할당되는 값은 Hive가 select 절에서 지원하는 표현식이어야 합니다. 따라서 산술 연산자, UDF, 캐스트, 리터럴 등이 지원됩니다. 서브쿼리는 지원되지 않습니다.
- WHERE 절과 일치하는 행만 업데이트됩니다.
- 파티셔닝 컬럼은 업데이트할 수 없습니다.
- 버케팅 컬럼은 업데이트할 수 없습니다.
- Hive 0.14에서 이 연산이 성공적으로 완료되면 변경 사항이 자동 커밋됩니다.
참고 사항
- update 연산에 대해서는 벡터화가 꺼집니다. 이는 자동이며 사용자의 조치가 필요 없습니다. update가 아닌 연산은 영향을 받지 않습니다. 업데이트된 테이블은 벡터화를 사용해 여전히 쿼리할 수 있습니다.
- 0.14 버전에서는 update를 할 때 hive.optimize.sort.dynamic.partition=false로 설정하는 것이 좋습니다. 더 효율적인 실행 계획을 생성하기 때문입니다.
Delete
버전 정보: DELETE는 Hive 0.14부터 사용할 수 있습니다.
Delete는 ACID를 지원하는 테이블에서만 수행할 수 있습니다. 자세한 내용은 Hive Transactions를 참고하세요.
구문
표준 구문:
DELETE FROM tablename [WHERE expression]
개요
- WHERE 절과 일치하는 행만 삭제됩니다.
- Hive 0.14에서 이 연산이 성공적으로 완료되면 변경 사항이 자동 커밋됩니다.
참고 사항
- delete 연산에 대해서는 벡터화가 꺼집니다. 이는 자동이며 사용자의 조치가 필요 없습니다. delete가 아닌 연산은 영향을 받지 않습니다. 데이터가 삭제된 테이블은 벡터화를 사용해 여전히 쿼리할 수 있습니다.
- 0.14 버전에서는 delete를 할 때 hive.optimize.sort.dynamic.partition=false로 설정하는 것이 좋습니다. 더 효율적인 실행 계획을 생성하기 때문입니다.
Merge
버전 정보: MERGE는 Hive 2.2부터 사용할 수 있습니다.
Merge는 ACID를 지원하는 테이블에서만 수행할 수 있습니다. 자세한 내용은 Hive Transactions를 참고하세요.
구문
표준 구문:
MERGE INTO <target table> AS T USING <source expression/table> AS S
ON <boolean expression1>
WHEN MATCHED [AND <boolean expression2>] THEN UPDATE SET <set clause list>
WHEN MATCHED [AND <boolean expression3>] THEN DELETE
WHEN NOT MATCHED [AND <boolean expression4>] THEN INSERT VALUES<value list>
개요
- Merge는 소스 테이블과의 조인 결과에 기반해 대상 테이블에 작업을 수행할 수 있게 해줍니다.
- Hive 2.2에서 이 연산이 성공적으로 완료되면 변경 사항이 자동 커밋됩니다.
성능 참고
SQL 표준은 ON 절이 소스의 1개 이상의 행이 대상의 행과 일치하도록 할 때 오류가 발생하도록 요구합니다. 이 검사는 계산 비용이 크며 MERGE 문의 전체 실행 시간에 큰 영향을 줄 수 있습니다. hive.merge.cardinality.check=false를 사용하면 검사를 비활성화할 수 있는데 이는 사용자 책임입니다. 검사가 비활성화되었지만 문이 그러한 교차 조인 효과를 가지면 데이터 손상으로 이어질 수 있습니다.
참고 사항
- 1, 2 또는 3개의 WHEN 절이 있을 수 있으며, UPDATE/DELETE/INSERT 각 유형은 최대 1개입니다.
- WHEN NOT MATCHED는 마지막 WHEN 절이어야 합니다.
- UPDATE와 DELETE 절이 모두 있으면 문의 첫 번째 절에 [AND
]이 포함되어야 합니다. - merge 연산에 대해서는 벡터화가 꺼집니다. 이는 자동이며 사용자의 조치가 필요 없습니다. delete가 아닌 연산은 영향을 받지 않습니다. 데이터가 삭제된 테이블은 벡터화를 사용해 여전히 쿼리할 수 있습니다.
예제
- 여기를 참고하세요.
더 알아보기 (Learn more)
INSERT OVERWRITE 시 트랜잭션 기록이 지워지는 것을 피하려면 Hive Transactions 문서를 읽어보세요. 동적 파티션 insert가 실무에서 어떻게 쓰이는지도 HCatalog Dynamic Partitioning을 참고하면 좋아요.