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