Hadoop Ecosystem/Hive

[하이브 완벽 가이드] Ch8. HiveQL : 색인(Index)

은재정 2022. 10. 4. 19:48

이 글은 하이브 완벽 가이드 책을 읽고 그 중 일부 내용을 정리한 글입니다.


하이브는 제한된 인덱스 기능을 가지고 있으며 인덱스 데이터를 원본 데이터가 아닌 별도의 테이블에 저장합니다. 인덱스는 논리적 파티션이 크기는 작고 개수가 많은 경우 파티셔닝을 대신해서 사용하기에 좋습니다. 다만 모든 쿼리가 인덱스로부터 이득을 얻을 수는 없기 때문에 EXPLAIN 문법을 사용하면 이를 확인할 수 있습니다. 인덱스 관리에는 추가적인 디스크 공간과 처리 비용이 필요하므로 득과 실을 잘 따져봐야 할 것입니다.

 

인덱스 생성

country와 state 두 개의 문자열 컬럼으로 파티셔닝된 매니지드 테이블인 employees 테이블이 있다고 가정할 때, 다음은 country 파티션에 인덱스를 생성하는 쿼리입니다.

 

CREATE INDEX employees_index ON TABLE employees (country)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERRED REBUILD
IDXPROPERTIES ('creator'='me')
IN TABLE employees_index_table PARTITIONED BY (country, name)
COMMENT 'Employees indexed by country and name';

 

AS ... 절은 인덱스를 구현한 자바 클래스를 인덱스 핸들러로 지정합니다. 만약 비트맵 인덱스를 사용하고 싶다면 AS 'BITMAP'으로 수정합니다. 인덱스 핸들러가 인덱스 테이블에 인덱스 데이터를 반드시 저장하는 것은 아니지만 만약 저장한다면 IN TABLE ... 절을 사용합니다.

 

WITH DEFERRED REBUILD를 지정했다면 새로운 인덱스는 비어있는 상태에서 시작합니다. 아래처럼 ALTER INDEX 문을 사용해서 인덱스를 언제든지 다시 만들 수 있습니다. 만약 PARTITION 절을 생략한다면 모든 파티션에 대해서 인덱스가 재구축됩니다.

 

ALTER INDEX employees_index
ON TABLE employees PARTITION (country='US') REBUILD;

 

인덱스 보기

다음은 테이블에 어떤 컬럼에 대해서든 정의된 모든 인덱스를 보여주는 명령어입니다.

 

SHOW FORMATTED INDEX ON employees;

 

인덱스 삭제

다음은 인덱스를 삭제하는 명령어입니다. 인덱스를 삭제하면 인덱스 테이블도 삭제됩니다. 하이브는 DROP TABLE로 인덱스 테이블을 직접 삭제하지 못하도록 합니다. 만약 인덱스가 존재하는 테이블을 삭제한다면 하이브는 인덱스와 인덱스 테이블도 같이 삭제합니다. 비슷하게 만약 원래 테이블의 파티션을 삭제한다면 관련된 파티션 인덱스도 삭제됩니다.

 

DROP INDEX IF EXISTS employees_index ON TABLE employees;