하이브에서 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;



'hadoop' 카테고리의 다른 글

[hive] collect_set  (0) 2016.04.30
[hadoop] getmerge 명령어  (0) 2016.04.21
[hive] group by 이후에 order by 개수 지정하기  (0) 2016.04.19
[hive] ALTER TABLE 예시  (0) 2016.04.19
[hive] alter table 시 주의 사항  (0) 2016.04.19
Posted by '김용환'
,