hadoop

[hive] count와 distinct 이슈

'김용환' 2016. 4. 20. 08:36


하이브에서 COUNT와 DISTINCT를 동시에 사용할 때, 

하이브는 mapred.reduce.tasks = 20으로 설정 리듀스 개수를 무시하고 오직 하나의 리듀서만 사용한다. 


데이터가 클 때 병목이 발생한다. 



이 방식의 해결책은 서브쿼리를 사용한다.


예시) 


* COUNT와 DISTINCT를 동시에 쓰면 하나의 리듀스에서만 실행된다.

SELECT count(distinct age)  FROM member;


* 서브 쿼리를 사용하면, 리듀스 작업을 mapred.reduce.tasks로 설정한 값으로 동작한다. DISTINCT를 사용하여 하나 이상의 리듀서를 사용하여 상대적으로 작은 양의 데이터에 COUNT를 실행한다. 따라서 리듀서 병목이 사라진다.

SELECT count(*) FROM (SELECT distinct age FROM member) a;