Hive 뷰 및 인덱싱: 예제를 통해 생성하기

⚡ 스마트 요약

Hive에서 뷰는 읽기 전용 테이블처럼 동작하는 저장된 쿼리이고, 인덱스는 조회 속도를 높이는 열을 가리키는 포인터입니다. 둘 다 여기에 나와 있는 간단한 HiveQL 문으로 생성할 수 있습니다.

  • 👁️ 관점은 논리적입니다: 뷰는 메타스토어에 SELECT 문만 저장하므로 자체적으로 디스크 공간을 차지하지 않습니다.
  • 🔒 의도적으로 읽기 전용으로 설정됨: 뷰는 LOAD, INSERT 또는 ALTER 작업의 대상이 될 수 없습니다. Hive는 모든 쿼리에서 뷰를 새로 평가하기 때문입니다.
  • 📍 데이터의 인덱스 포인트: 인덱스는 Hive가 테이블 전체 대신 파일의 일부를 읽을 수 있도록 하는 열 값에 대한 포인터입니다.
  • 🗂️ 두 개의 핸들러: 컴팩트 인덱싱은 카디널리티가 높은 열에 적합하고 비트맵 인덱싱은 고유값이 적은 열에 적합합니다.
  • 🔄 수동 재구축: 인덱스는 자동으로 새로 고쳐지지 않으므로 기본 테이블이 변경된 후에는 ALTER INDEX REBUILD 명령을 실행해야 합니다.
  • 🚫 Hive 3.0에서 제거됨: HIVE-18448 업데이트에서 인덱싱 기능이 제거되었으며, 구체화된 뷰, ORC 또는 Parquet 스토리지 및 파티셔닝이 이를 대체합니다.

Hive의 뷰와 인덱스를 예제를 통해 설명합니다.

뷰란 무엇입니까?

뷰는 테이블과 유사하며 요구 사항에 따라 생성됩니다. 뷰는 자체 저장소가 없는 순수 논리적 객체입니다. 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에서는 인덱스가 여전히 유효하지만, 새로운 작업에는 위의 옵션 중 하나를 사용하는 것이 더 좋습니다.

자주 묻는 질문

`DROP VIEW view_name`은 뷰를 삭제하고, `ALTER VIEW view_name RENAME TO new_name`은 뷰의 이름을 변경합니다. 뷰는 데이터를 저장하지 않으므로 삭제하는 것이 더 적절합니다.ping 기본 테이블은 전혀 건드리지 않고, 메타스토어 항목만 사라집니다.

구체화된 뷰는 미리 계산된 쿼리 결과를 실제 데이터로 저장하므로 디스크 공간을 차지하고 재구축(REBUILD)이 필요합니다. 일반 뷰는 쿼리 텍스트만 저장하며 참조될 때마다 다시 계산됩니다.

아니요. 메타스토어에는 SELECT 문과 결과 열 목록만 저장됩니다. 모든 참조는 기본 쿼리를 다시 실행하므로 느린 조인을 통해 뷰를 생성하면 속도가 느려지는 것입니다.

Hive 0.12.0 이전 버전에서는 CREATE INDEX 및 DROP INDEX 명령에서 인덱스 이름이 대소문자를 구분했고, ALTER INDEX 명령에서는 소문자를 사용해야 했습니다. Hive 0.13.0 버전부터는 모든 명령에서 인덱스 이름이 대소문자를 구분하지 않게 되었습니다.

네, 최신 클러스터라면 모두 가능합니다. 파티션 가지치기는 스캔 시작 전에 전체 디렉터리를 제거하고, 버킷팅은 조인 또는 샘플링 범위를 특정 파일로 좁혀 일반적으로 인덱스 테이블보다 뛰어난 성능을 제공합니다.

머신러닝 도구는 쿼리 로그를 분석하고, 선택도와 빈도를 기준으로 조건자 열의 순위를 매기고, 구체화된 뷰 또는 파티션 체계가 효과적인 위치를 제안합니다. 각 제안을 적용하기 전에 EXPLAIN 실행 계획을 통해 유효성을 검사하십시오.

간단한 주석만으로도 CREATE VIEW 문을 안정적으로 생성합니다. 버전별 설정을 확인하십시오. Hive 3.0 이상 클러스터에서 즉시 거부되는 CREATE INDEX 구문을 여전히 생성하기 때문입니다.

인덱스는 별도의 포인터 테이블이며, Hive는 기본 테이블이 변경되더라도 인덱스를 새로 고치지 않습니다. 재구축이 없으면 포인터가 오래되어 최적화 프로그램이 인덱스를 건너뛰거나 오래된 일치 항목을 반환합니다.

이 게시물을 요약하면 다음과 같습니다.