Hive 질의

정렬과 집계

하이브에서는 데이터 정렬은 표준 ORDER BY 절로 수행할 수 있다. 입력에 대한 전체 정렬을 병렬로 수행한다. 전체적으로 정렬된 결과가 반드시 필요한 경우가 아니면 하이브의 비표준 확장인 SORT BY 를 대신 사용하는 것이 좋다. SORT BY 는 리듀서별로 정렬된 파일을 생성한다.

특정 행을 하나의 리듀서로 모이게 제어하고 싶을 때가 있다. 그 다음에 집계 연산을 수행하는 것이 일반적이다. 이것은 바로 하이브의 DISTRIBUTE BY 절이 하는 역할이다.

FROM records2
SELECT year, temperature
DISTRIBUTE BY year
SORT BY year ASC, temperature DESC;

이러한 방식을 사용하면 특정 연도의 모든 행이 동일한 리듀서 파티션으로 가도록 보장할 수 있다.

이 쿼리에 내포된 서브쿼리나 후행 쿼리는 연도별로 모든 기온이 동일한 파일에 모여 있고 내림차순 정렬되어 있다는 사실을 기반으로 데이터를 처리할 수 있다.

SORT BY 와 DISTRIBUTE BY 에 사용되는 컬럼이 동일하다면 약식으로 CLUSTER BY를 사용할 수 있다.



맵리듀스 스크립트

하둡 스트리밍과 같은 방식을 사용하면 TRANSFORM, MAP, REDUCE 절을 통해 외부 스크립트나 프로그램을 하이브에서 호출할 수 있다. 어떤 조건을 만족하지 못하는 행을 걸러내기 위해 잘못된 관측지를 제거하는 스크립트를 Hive 에서 사용할 수 있다.

import re
import sys

for line in sys.stdin:
  (year, temp, q) = line.strip().split()
  if (temp != '9999' and re.match('[01459]', q)):
    print('{0}\t{1}').format(year, temp)
ADD FILE /.../*.py;

FROM records2
SELECT TRANSFORM(year, temperature, quality)
USING 'is_good_quality.py'
AS year, temperature;

쿼리를 실행하기 전에 해당 스크립트를 하이브에 미리 등록해야 한다. 이렇게 해야 하이브가 이 파일을 하둡 클러스터에 미리 보내 준비시킨다.

이 쿼리는 year, temperature, quality 필드를 탭으로 구분하여 python 스크립트로 내보내고, 탭으로 구분된 출력을 이 쿼리의 출력 형식에 맞게 year 와 temperature 필드로 분리한다.

중첩된 형식으로 사용하면 맵과 리듀스 함수를 지정할 수 있다. 두 경우 모두 SELECT TRANSFORM을 사용해도 그 결과는 같다.

FROM (
  FROM records2
  MAP year, temperature, quality
  USING 'is_good_quality.py'
  AS year, temperature) map_output
REDUCE year,temperature
USING 'nax_temperature_reduce.py'
AS year, temperature;