Hive 서브쿼리, 뷰


서브쿼리는 다른 SQL 구문에 내포된 SELECT 구문이다. 하이브는 서브쿼리를 제한적으로 지원하는데, SELECT 구문의 FROM 절과 WHERE 절에서만 서브쿼리를 사용할 수 있다.




뷰는 SELECT 문으로 정의된 일종의 가상테이블이다. 뷰는 사용자에게 디스크에 실제 저장된 것과 다른 방식으로 데이터를 보여주는 데 사용된다. 기존 테이블의 데이터는 추가적인 처리가 쉽도록 특정 방식으로 단순화되어 있거나 모여 있다. 뷰는 사용자가 보기 권한이 있는 테이블의 특정 부분에만 접근할 수 있도록 제한하는 데 사용될 수도 있다.

하이브에서 뷰는 생성될 때 디스크에 실체화되지 않는다. 대신 SELECT 구문에서 해당 뷰를 참조하는 쿼리가 실행될 때 실체화된다. 만일 뷰가 기본 테이블에 대한 광범위한 변환을 수행하거나 자주 사용된다면 그 뷰의 내용을 생성된 새로운 테이블에 저장하는 방식으로 직접 실체화하는 방법도 있다.


CREATE VIEW valid_records
AS
SELECT *
FROM records2
WHERE $CONDITIONS


뷰가 생성될 때 쿼리가 실제 실행되는 것은 아니고, 단지 메타스토어에만 저장된다.</b> SHOW TABLES 명령을 실행하면 뷰도 볼 수 있다. 뷰를 정의한 쿼리를 포함하여 원하는 뷰에 대한 상세한 정보를 얻고 싶으면 DESCRIBE EXTENDED view_name 명령을 실행하면 된다.


CREATE VIEW max_temperatures (station, year, max_temperature)
AS
SELECT station, year, MAX(temperature)
FROM valid_records
GROUP BY station, year;


뷰는 컬럼 이름을 명시적으로 표시할 수 있다. 만약 MAX(temperature) 같이 집계 연산자가 있을 때 명시적으로 컬럼 이름을 선언해주지 않으면 하이브는 _c2와 같은 별칭을 대신 생성해준다.


SELECT station, year, AVG(max_temperature)
FROM max_temperatures
GROUP BY station, year; 


이 쿼리의 결과는 서브쿼리를 사용한 것과 같다. 또한 하이브가 생성한 맵리듀스 잡의 수는 각 GROUP BY 별로 할당되었기 때문에 똑같이 두 개다. 이 예제는 하이브가 뷰에 해당하는 쿼리를 포함하여 일련의 잡으로 결합할 수 있다는 것을 보여준다. 이렇게 하면 뷰가 없는 쿼리를 작성한 것과 동일한 결과를 얻는다. 다른 말로 하면, 실행 시점에도 뷰를 쓸데없이 실체화하지 않는다는 것이다.

하이브에서 뷰는 읽기 전용이다. 따라서 뷰를 이용하여 원래의 기존 테이블에 데이터를 로드하거나 삽입할 수는 없다.