Hadoop echosystem의 일부로, Apache Hadoop위에서 SQL을 사용하여 분산된 스토리지에 저장된 데이터에 대해 쿼리를 할 수 있는 데이터 웨어하우스 시스템이다.
Hive는 hadoop 환경에서 복잡한 map-reduce 코드 대신에 SQL과 유사한 HiveQL로 데이터를 처리할 수 있도록 해주며, 파일시스템에 저장된 데이터의 catalog와 metastore (hive metastore)를 제공하여 데이터베이스, 테이블, 파티션과 같이 데이터를 구조화 할 수 있다. AWS 에서는 EMR 클러스터 생성시 hive를 사용할 수 있으며, hive metastore는 glue라는 서비스로 제공한다.
Hive는 데이터를 insert 하는 시점에는 스키마를 체크하지 않고, read 하는 시점에 schema를 체크한다 (schema-on-read). 이는 데이터의 형태가 변할 여지가 많은 빅데이터 처리시에 적합한 속성이다. 따라서 스키마 변경없이 부담 없이 진행 가능하다.
파티션은 테이블의 데이터 분배와 path를 결정한다. 일반적으로 테이블 데이터 path의 subpath에 위치 시키는데, 테이블 데이터가 /hourly/table1/
에 위치하고, date라는 컬럼을 파티션으로 사용한다면 파티션은 /hourly/table1/date=2022-04-23
과 같은 형태로 존재하게 된다. Hive 테이블은 여러 파티션을 갖을 수 있다.
파티션을 나누면 쿼리시 data scan을 줄여 쿼리의 성능을 높일 수 있다. 만약 파티션이 존재하지 않는다면 테이블 데이터 path 에 존재하는 모든 데이터를 scan 한다. 파티션이 있더라도 쿼리에 파티션을 조건으로 줘야한다. 위의 예제에서 SELECT * FROM table1 WHERE date=2022-04-23
과 같은 쿼리를 실행하면 /hourly/table1/date=2022-04-23/
에 존재하는 데이터만 scan 한다.
파티션은 아래와 같이 선언할 수 있다.
PARTITIONED BY (`column` `column type`, ...)
버킷은 버킷 컬럼 해시를 기준으로 파티션 내의 데이터를 지정된 개수의 파일로 분리해서 저장한 것이다. 버킷 컬럼 해시 값이 같은 행들을 같은 버킷에 저장된다.
버킷을 사용하면 쿼리의 data scan을 줄여 쿼리의 성능을 높일 수 있다. 예를 들어 join key로 버킷 컬럼을 사용하면 join key 값에 해당하는 버킷만 scan 하면 된다. 또한 where 조건에 버킷 컬럼을 사용하면 마찬가지로 해당하는 버킷만 scan하면 된다
버킷은 아래와 같이 선언할 수 있다.
CLUSTERED BY (`column`) INTO `num of bucket` BUCKETS;