Hive 뷰 및 인덱싱: 예제를 통해 생성하기
⚡ 스마트 요약
Hive에서 뷰는 읽기 전용 테이블처럼 동작하는 저장된 쿼리이고, 인덱스는 조회 속도를 높이는 열을 가리키는 포인터입니다. 둘 다 여기에 나와 있는 간단한 HiveQL 문으로 생성할 수 있습니다.
뷰란 무엇입니까?
뷰는 테이블과 유사하며 요구 사항에 따라 생성됩니다. 뷰는 자체 저장소가 없는 순수 논리적 객체입니다. Hive는 메타스토어에 쿼리 텍스트만 저장하고 뷰가 참조될 때마다 해당 쿼리 텍스트를 평가합니다.
- 모든 결과 세트 데이터를 Hive의 뷰로 저장할 수 있습니다.
- 사용법은 뷰에서 사용하는 방식과 유사합니다. SQL
- 뷰는 읽기 전용이므로 데이터를 쓰는 LOAD, INSERT 또는 ALTER 문의 대상이 될 수 없습니다.
뷰 생성:
구문 :
Create VIEW <VIEWNAME> AS SELECT
정식으로 문서화된 형식은 IF NOT EXISTS 절과 선택적 열 목록도 허용합니다. 이는 SELECT 목록에 일반 열 이름 대신 표현식이 포함된 경우 유용합니다.
예:
Hive>Create VIEW Sample_View AS SELECT * FROM employees WHERE salary>25000
이 예제에서는 급여 필드 값이 25000보다 큰 모든 행 값을 표시하는 Sample_View라는 뷰를 생성합니다. 필터는 뷰 내부에 있으므로 Sample_View에서 데이터를 선택하는 모든 쿼리는 해당 조건을 만족하는 행만 표시합니다.
지수란 무엇입니까?
인덱스는 테이블의 특정 열 이름을 가리키는 포인터입니다. 인덱스의 목적은 조회 속도를 향상시키는 것입니다. 인덱스가 없으면 다음과 같은 조건자를 포함하는 쿼리가 실행될 때 속도가 매우 느려집니다. WHERE tab1.col1 = 10 Hive는 전체 테이블 또는 파티션을 로드하고 모든 행을 처리하는 반면, col1에 인덱스가 있으면 Hive는 파일의 일부만 읽을 수 있습니다.
- 사용자가 수동으로 인덱스를 정의해야 합니다.
- 인덱스를 생성한다는 것은 테이블의 특정 열 이름을 가리키는 포인터를 생성하는 것을 의미합니다.
- 테이블에 있는 열에 대한 모든 변경 사항은 해당 열 이름에 생성된 인덱스 값을 사용하여 저장됩니다.
이러한 속도 향상에는 비용이 따릅니다. 인덱스를 구축하는 데 추가적인 처리 작업이 필요하며, 인덱스 자체는 테이블과 함께 유지 관리해야 하는 디스크 공간을 차지합니다.
구문 :
Create INDEX <INDEX_NAME> ON TABLE <TABLE_NAME(column names)>
예:
Create INDEX sample_Index ON TABLE guruhive_internaltable(id)
여기서는 guruhive_internaltable 테이블의 id 열에 인덱스를 생성합니다. 인덱싱을 지원하는 릴리스에서 전체 문장을 작성하려면 index-handler 절도 필요하며, 다음 섹션에서 전체 내용을 보여줍니다.
Hive에서 뷰와 인덱스의 차이점
뷰와 인덱스는 둘 다 기존 테이블 위에 존재하기 때문에 종종 함께 소개되지만, 해결하는 문제는 다릅니다. 뷰는 쿼리가 보는 내용을 변경하는 반면, 인덱스는 Hive가 해당 테이블을 찾는 속도를 향상시킵니다. 아래 표에서 둘을 비교합니다.
| 아래 | 관측 | 색인 |
|---|---|---|
| 저장하는 내용 | 메타스토어에는 SELECT 문만 있습니다. | 데이터에 대한 포인터를 저장하는 별도의 인덱스 테이블 |
| 목적 | 쿼리 결과값을 단순화하거나 제한합니다. | 술어를 찾기 위해 스캔하는 데이터 양을 줄입니다. |
| 디스크 비용 | 없음 | 데이터 변경 후 추가 저장 공간 및 재구축 |
| 쓰기 액세스 | 읽기 전용 | 직접 쿼리하지 않고, 최적화 프로그램이 사용합니다. |
| 현재 상태 | 완벽하게 지원됨 | Hive 3.0에서 제거됨 |
실제로 뷰는 가독성과 접근 제어를 위해 생성되고, 인덱스는 특정 열에 대한 성능 향상을 위해 생성되었습니다.
Hive의 인덱스 유형 및 구문
Hive 2.x 이전 버전에는 두 개의 인덱스 핸들러가 포함되어 있으며, 핸들러 이름은 필수 AS 절에 지정됩니다. 컴팩트 인덱싱은 Hive 0.7.0에서, 비트맵 인덱싱은 Hive 0.8.0에서 도입되었습니다.
- 간략한 목차: 각 값의 위치를 개별적으로 기록하는 대신, 해당 값이 저장된 HDFS 블록의 주소와 함께 값을 저장합니다. 이는 서로 다른 값이 많은 열에 적합합니다.
- 비트맵 인덱스: 각 고유 값마다 비트맵을 저장하는데, 이는 상태 또는 성별 플래그와 같이 고유 값의 수가 적은 열에 일반적으로 사용되는 방식입니다.
컴팩트 인덱스는 다음과 같이 생성, 나열 및 삭제됩니다.
CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT'; SHOW INDEX ON table01; DROP INDEX table01_index ON table01;
WITH DEFERRED REBUILD 옵션은 인덱스를 채우지 않고 등록하므로 ALTER INDEX를 사용하여 빌드를 별도로 예약할 수 있습니다. 비트맵 인덱스도 같은 방식으로 생성되지만 핸들러 이름이 다릅니다.
CREATE INDEX table03_index ON TABLE table03 (column4) AS 'BITMAP' WITH DEFERRED REBUILD; ALTER INDEX table03_index ON table03 REBUILD; SHOW FORMATTED INDEX ON table03; DROP INDEX table03_index ON table03;
인덱스는 자동으로 새로 고쳐지지 않습니다. 기본 테이블에 새 데이터가 추가될 때마다 `ALTER INDEX … REBUILD` 명령을 다시 실행해야 하며, 파티션된 테이블의 경우 재구축 작업이 단일 파티션으로 제한될 수 있습니다.
Hive 3.0에서 인덱싱이 제거된 이유는 무엇인가요?
HIVE-18448에 따라 버전 3.0에서 Hive의 인덱싱 기능이 제거되었으므로 현재 클러스터에서는 CREATE INDEX, SHOW INDEX 및 DROP INDEX 명령을 더 이상 사용할 수 없습니다. 컬럼형 스토리지와 비용 기반 최적화 도구가 성숙해짐에 따라 인덱싱 기능은 재구축 비용 대비 효율성이 떨어졌습니다. 동일한 기능을 수행하는 세 가지 대체 명령이 있습니다.
- 구체화된 뷰: Hive 3.0.0에서 도입된 기능입니다. 구체화 된 뷰 쿼리의 미리 계산된 결과를 저장하고, 최적화 프로그램은 들어오는 쿼리를 해당 결과를 기준으로 자동으로 다시 작성합니다.
- 컬럼형 파일 형식: ORC와 Parquet은 자체적인 경량 인덱스와 최소/최대 통계를 포함하고 있으므로, 사용자가 인덱스를 정의하지 않아도 전체 스트라이프, 블록 또는 파일을 건너뛸 수 있습니다.
- 파티션 및 버킷: 파티셔닝 및 버케팅 디렉토리 및 파일 수준에서 데이터를 정리하면 일반적으로 인덱스보다 훨씬 더 많은 입력값을 제거합니다.
Hive 2.x에서는 인덱스가 여전히 유효하지만, 새로운 작업에는 위의 옵션 중 하나를 사용하는 것이 더 좋습니다.

